裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

スピログラフ(ついでに)

2010年09月01日 | ブログラミング

Taglibro de H
http://ito-hi.blog.so-net.ne.jp/2009-11-05

ついでにスピログラフのプログラムを while などを使わずに書いてみる。
ずいぶん短くなるし,描画もあっという間であるけれど。
while で描く方が,とろとろ描いていておもしろいのだけど(笑)。

spirograph <- function(
    gr,                # 外円の半径
    sr,                # 内円の半径
    pr,                # 内円内のペンの位置
    accuracy=100,        # 描画精度
    col = "black",        # 描画色
    lwd = 1)            # 描画線幅
{
    gcd <- function(a, b) {
        r <- a %% b
        return(ifelse(r == 0, b, gcd(b, r)))
    }

    gr <- trunc(gr)
    sr <- trunc(sr)
    pr <- trunc(pr)
    if (gr <= 0 | sr <= 0 | pr <= 0) {
        stop("Parameters must be postive.")
    }
    theta0 <- seq(0, 2*pi*sr/gcd(gr, sr), length=accuracy*sr/gcd(gr, sr))
    theta1 <- theta0*(gr/sr)
    x <- (gr-sr)*sin(theta0)-pr*sin(theta1)
    y <- (sr-gr)*cos(theta0)-pr*cos(theta1)
    old <- par(mar=c(0, 0, 0, 0))
    plot(x, y, type="n", axes=FALSE, xlab="", ylab="", asp=1)
    lines(x, y, lwd=lwd, col=col)
    par(old)
}

layout(matrix(1:4, 2))
spirograph(150, 108, 60)
spirograph(72, 552, 600, lwd = 3)
spirograph(11, 30, 45, col="red")
spirograph(15*29, 15*23, 50)
layout(1)

描画結果

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ユークリッドの互除法 | トップ | ドラゴン曲線 »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事