正三角形を用いたフラクタル表現
課題
上図のように、正三角形ABCを作成する。名前をpoly1とする。
(1)下図のように、点Aを拡大の中心点として、poly1を0.8倍した多角形(poly2)を作成せよ。
(2)poly2の、点Bに対応する頂点を、B2とする。
下図のように、B2を拡大の中心点として、poly2を0.8倍した多角形(poly3)を作成せよ。
(3)poly3の、点Cに対応する頂点を、C3とする。
下図のように、C3を拡大の中心点として、poly3を0.8倍した多角形(poly4)を作成せよ。
(4)(1)〜(3)の作業を同様に繰り返し、poly101まで作成した場合の様子を、下図のように図示せよ。なお、poly2〜poly101を逐一作成していくのは煩雑であるから、リストとして一括して作成する方法を検討せよ。
(5)(4)の作業で、「0.8倍」という条件を、「0.95倍」「0.25倍」「マイナス0.75倍」「マイナス0.89倍」「マイナス1倍」に変更した場合の結果を、それぞれ図示せよ。なお、「ある点Pを拡大の中心点として、オブジェクトをマイナスk倍する」というのは、当該オブジェクトを、点Pを中心に反転し、それを、点Pを中心にk倍する、ということである。
解答例
(1)〜(3)
poly2 = Dilate[poly1, 0.8, A]
poly3 = Dilate[poly2, 0.8, B2]
poly4 = Dilate[poly3, 0.8, C3]
(4)の一括作成方法
Zip[Element[β, 1], β, IterationList[{Dilate[Element[α, 1], 0.8, Element[{Vertex[Element[α, 1]]}, Loop[Element[α, 2], Length[{Vertex[Element[α, 1]]}]]]], Element[α, 2] + 1}, α, {{poly1, 1}}, 100]]
IterationListコマンドを用いて、poly1〜poly101を集めたリストを、帰納的に定義している。
なお、ここで用いられているLoopコマンドは、オリジナルツールである。Loopツールの解説、および、ツール導入のためのggtファイルは、下記記事を参照。
(5)
数値オブジェクトratioを用意し、上記解答例の数式における「0.8」を、ratioに置き換えた数式
Zip[Element[β, 1], β, IterationList[{Dilate[Element[α, 1], ratio, Element[{Vertex[Element[α, 1]]}, Loop[Element[α, 2], Length[{Vertex[Element[α, 1]]}]]]], Element[α, 2] + 1}, α, {{poly1, 1}}, 100]]
によって、リストオブジェクトを作成する。
ratioを0.95, 0.25, -0.75, -0.89, -1に変化させた場合の、当該リストオブジェクトの描画を観察しよう。
ratioをマイナスにした途端、図形が外側に成長し始めた。
ratio = -0.89 では、各頂点と辺が重なって見えて、美しい。
各頂点と点がぴったり重なるratioは、厳密には、-0.89ではないかもしれない。これを計算するというのも、面白い問題だ。
ratio = -1 のときは、六芒星になった。