F02 ペンローズタイリング
タイル1枚を収縮するツールの作成
カイトやダートはこの項最後の図に示した2点のリストで表します。カイトまたはダートのタイルを1つ与えると、収縮して得られるタイルのリストを返すツール DeflKK1, DeflKD1, DeflDK1, DeflDD1 を作成します。
Ps = {(1,1), (3,2)}
K1 = Element[Ps,1]
K2 = Element[Ps,2]
K5 = Rotate[K1, -pi/5, K2]
K3 = Rotate[K5, -3pi/5, K6]
K6 = Rotate[K1, -2pi/5, K2]
K7 = Rotate[K6, 2pi/5, K5]
D1 = Element[Ps,1]
D2 = Element[Ps,2]
D4 = Rotate[D1, -3pi/5, D2]
D5 = Rotate[D2, -pi/5, D4]
D6 = Rotate[D5, -4pi/5, D2]
KK = {K5,K7,K5,K1}
KD = {K5,K6}
DK = {D2,D6}
DD = {D2,D5}
新規ツール: KK = DeflKK[Ps]
新規ツール: KD = DeflKD[Ps]
新規ツール: DK = DeflDK[Ps]
新規ツール: DD = DeflDD[Ps]
タイルのリストを収縮するツールの作成
カイトのリストとダートのリストをリストで与えると、収縮して現れるカイトのリストとダートのリストを返すツール (Defl) を作成します。
KsDs = { {(2,3),(4,4)}, {(2,6),(4,7)} }
Ks = Element[KsDs,1]
Ds = Element[KsDs,2]
KKs = Join[Sequence[DeflKK[Take[Ks,2i-1,2i]], i, 1, Length[Ks]/2]]
KDs = Join[Sequence[DeflKD[Take[Ks,2i-1,2i]], i, 1, Length[Ks]/2]]
DKs = Join[Sequence[DeflDK[Take[Ds,2i-1,2i]], i, 1, Length[Ds]/2]]
DDs = Join[Sequence[DeflDD[Take[Ds,2i-1,2i]], i, 1, Length[Ds]/2]]
KsDs2 = {Join[KKs,DKs], Join[KDs,DDs]}
新規ツール: KsDs2 = Defl[KsDs]
タイル1枚を与えるとその線分のリストを返すツールの作成
カイトを与えるとその線分のリストを返すツール (Kseg) を作成します。
L1 = {Segment[K1,K2], Segment[K2,K3]}
新規ツール: L1 = Kseg[Ps]
ダートを与えるとダートの線分のリストを返すツール (Dseg) を作成します。
L2 = {Segment[D1,D2], Segment[D1,D4]}
新規ツール: L2 = Dseg[Ps]
タイルのリストを与えるとその線分のリストを返すツールの作成
カイトのリストとダートのリストをリストで与えると、それらの線分のリストを返すツール (PenSeg) を作成します。
L3 = Sequence[Kseg[Take[Ks,2i-1,2i]], i, 1, Length[Ks]/2]
L4 = Sequence[Dseg[Take[Ds,2i-1,2i]], i, 1, Length[Ds]/2]
L5 = {L3, L4}
新規ツール: L5 = PenSeg[KsDs]
ペンローズタイリングのツールの作成
2点を与えるとペンローズタイリングを描くツール (Penrose) を作成します。
新規の点 A、B を作成してから、
N = {Sequence[Rotate[B, i pi/5, A], i, 1, 10], {} }
N2 = Defl[Defl[Defl[Defl[Defl[N]]]]]
N3 = PenSeg[N2]
新規ツール: N3 = Penrose[A, B]
とします。N は、カイトが5個丸く集まった「太陽」と呼ばれる形で、これを元に収縮しています。N2 の定義での Defl の回数は適当に決めます。一度オブジェクトをすべて削除してから Penrose ツールを選択し、グラフィックスビューで2度クリックすると、下図のようにペンローズタイリングが作図されます。外周の部分は線分が書かれませんが仕様です。
収縮のアルゴリズムのメモ
下図の点線のベクトルがカイト、実線のベクトルがダートで、黒いベクトルを収縮すると赤いベクトルになるというアルゴリズムです。