Gasket
to msgn :num
output * -1 :num
end
to filltriangle :x :y :size
penup
setxy sentence :x :y
pendown
repeat 3 [forward :size right 120]
penup
right 30
forward * :size 0.578
pendown
if :size >= 1 then fill else dot pos
end
to SierpinskiGasket :x :y :d :size
if :d = 0 [stop]
(local "new.size "add.x "add.y)
make "new.size (/ :size 2)
make "add.x (* :size 0.75)
make "add.y (* :size 0.433)
make "d (- :d 1)
SierpinskiGasket :x :y :d :new.size
SierpinskiGasket (+ :new.size :x) :y :d :new.size
SierpinskiGasket (+ / :new.size 2 :x) (+ :add.y :y) :d :new.size
setheading 210
filltriangle (+ :add.x :x) (+ :add.y :y) :new.size
end
to gasketDraw :depth [:plane 300] 1
(local
"po.x "po.y
"current.pc "current.bgc
)
make "po.x msgn / :plane 2
make "po.y msgn * :plane 0.433
make "current.pc pencolor
make "current.bgc background
penup
setheading 30
filltriangle :po.x :po.y :plane
setpc :current.bgc
SierpinskiGasket :po.x :po.y :depth :plane
setpc :current.pc
end
(gasketDraw 1 150)
|
(gasketDraw 2 150)
|
|
|
(gasketDraw 5 150)
|
(gasketDraw 7 150)
|
|
|
シェルピンスキのギャスケット図形です。
再帰レベルが5くらいだと、矢じり図形によく似ています。
しかし、更に再帰が深くなると図形は、消えて無くなってしまいます。
それは、ギャスケットが図形を刳り貫いて描かれている図形だからです。
※ギャスケットとは、エンジンなどのシリンダー部品やパイプの繋ぎ目などの、ガス漏れや液漏れ防止用の穴が開いたパッキング(詰め物の一種)部品の事です。
穴を空けて残った領域に、更に穴を空けて行く事を繰り返せば、最終的には穴だけの図形になりますね。(:-P)
Carpet
to carpet :x :y :d :size
if :d = 0 [stop]
(local
"new.size "add.size
"x.new "y.new
"x.add "y.add
)
make "new.size (/ :size 3)
make "add.size (* :new.size 2)
make "x.new (+ :x :new.size)
make "y.new (+ :y :new.size)
make "x.add (+ :x :add.size)
make "y.add (+ :y :add.size)
make "d (- :d 1)
carpet :x :y :d :new.size
carpet :x.new :y :d :new.size
carpet :x.add :y :d :new.size
carpet :x :y.new :d :new.size
carpet :x.add :y.new :d :new.size
carpet :x :y.add :d :new.size
carpet :x.new :y.add :d :new.size
carpet :x.add :y.add :d :new.size
fillSquare :x.new :y.new :new.size
end
to carpetDraw :depth [:plane 300] 1
(local
"po.x "po.y
"current.pc "current.bgc
)
make "current.pc pencolor
make "current.bgc background
make "po.x msgn / :plane 2
make "po.y :po.x
penup
setxy sentence :po.x :po.y
pendown
(stamprect :plane :plane "true)
setpc :current.bgc
carpet :po.x :po.y :depth :plane
setpc :current.pc
end
(carpetDraw 1 150)
|
(carpetDraw 3 150)
|
(carpetDraw 5 150)
|
|
|
|
今度は、カーペットです。
しかし、穴の開いたカーペットって実用的ではありませんね。B^)
考え方は、ギャスケット図形と一緒です。これも、最終的には穴だけの図形になってしまいます。
|