Hilbert Curve

to msgn :num
    output * -1 :num
end
         
to revrseAngle
    make "stat.angle msgn :stat.angle
end
         
to hilbert :d
    if :d = 0 [stop]
         
    make "d (- :d 1)
    revrseAngle
    right :stat.angle
    hilbert :d
    revrseAngle
    forward :atom
    right :stat.angle
    hilbert :d
    forward :atom
    hilbert :d
    right :stat.angle
    forward :atom
    revrseAngle
    hilbert :d
    right :stat.angle
    revrseAngle
end
         
to hilbertCurve :depth [:plane 300] 1
    (local
    "stat.angle
    "atom
    )
         
    make "stat.angle 90
    make "atom :plane
         
    penup
    setxy sentence / :plane 2 msgn / :plane 2
    pendown
    repeat 4 [forward :plane left 90]
         
    repeat :depth [make "atom (/ :atom 2)]
    penup
    forward / :atom 2
    left 90
    forward / :atom 2
    right 90
    pendown
    hilbert :depth
end



hilbertCurve 6

 あまりにも有名なヒルベルト曲線です。
ドイツの数学者が発見したので、その人の名前が付いています。

コの字の形を、基本図形とした自己相似図形です。
このタイプの図形は、空間充填曲線とも呼ばれています。
再帰レベルが深くなるほど空間(この場合は plane で指定された平面)を、線で埋め尽くしていきます。

プログラムの中心となる所は、手続き hibert です。
コの字の反転パターンを、revrseAngle 手続きを使い自己定義させています。
右にしか方向を変えていませんが、マイナス90度右(つまり左に90度)に方向転換をしているのです。



Sierpinski Curve

to seconds.since.midnight
    local "t
         
    make "t time
    output + + * first :t 3600 (* item 2 :t 60) last :t 
end
         
to Seg :d
    if :d < 1 [
      forward :atom
      left 45
      forward :batom
      left 45
      forward :atom
      stop
    ]
         
    make "d (- :d 1)
    Seg :d
      right 90
      forward :atom
      right 90
    Seg :d
      left 45
      forward :batom
      left 45
    Seg :d
      right 90
      forward :atom
      right 90
    Seg :d
end
         
to sierpinskiCurve :depth [:plane 300] 1
    (local
    "atom "batom "tatom
    "stime "etime
    )
         
    ; Setup   
    make "atom (/ :plane 4) 
    repeat :depth [make "atom (/ :atom 2)]
    make "depth (- :depth 1)
    make "tatom (* * :atom cos 45 2)
    make "batom (* :atom 2)
    make "atom :tatom
    penup
    setxy sentence msgn / :plane 2 (/ :plane 2)
    setheading 0
    pendown
    repeat 4 [right 90 forward :plane]
    penup
    right 135
    forward * :atom 1.5
    left 90
    forward / :atom 2
    right 90
    pendown
         
    ; Main
    make "stime seconds.since.midnight
    repeat 4 [
      Seg :depth
      right 90
      forward :atom
      right 90
    ]
    make "etime seconds.since.midnight
    print sentence "|Sec| (- :etime :stime)
end
                  




sierpinskiCurve 5
Sec 14
iMac Rev.Dで、描画に掛かった時間が14秒。|-(

 これも奇麗な再帰パターンのシェルピンスキ曲線です。
ヒルベルトと同じく空間充填曲線の仲間です。
ヒルベルト曲線は、図形が閉じていない開曲線でしたが、このシェルピンスキ曲線は、閉じている閉曲線です。

図形を、4分の1づつ描きながら再帰を繰り返す様にプログラムされています。