見出し画像

【フラクタル解説】FNFE Project #8「F.T.D.」

※F.T.D.=Fortuity To Draw.

どうもこんにちは。FNFE Projectへようこそ!
FNFEは「For New Fractal Enthusiasts(新たなフラクタル愛好家へ)」の略です。このコーナーでは「フラクタルに興味があるけど、何から始めたらいいかわからない。。。定義を見ても何が何だかさっぱりだ、、、」という人のために、フラクタルのことを分かりやすく解説していきます。
フラクタルについて一切知らない人でもフラクタルの面白さに気付けるように構成しているので、フラクタルが全く分からないという人でも是非読んでみてください!
今回はフラクタルを描画する方法の一つ、「カオスゲーム」について解説します。

連荘

ということで今回も解説おにいさんが来ます。今日は行列とベクトルを教えてくれるらしいです。表情から大事感が伝わってきますね。

解説おにいさんを知らない人に説明すると、大切な概念だが本題とは直接関係ないことを解説してくれる人です

(解説おにいさん視点)
まず行列というのは、数を縦横に長方形の形で並べたもののことです。例えばこういう感じです。

ちなみに()と[]を使い分ける意味はあんまりありません。(マジ)

行列の中にある数や文字を行列の成分といい、横に並んだ成分を、縦に並んだ成分をといいます。また、上からA番目の行の左からB列目の成分を(A,­ B)成分と表します。
行がn個、列がm個ある行列をn行m列の行列(あるいはn×m行列)といいます。行×列です。
ということで行列の加減乗(除は基本的にはない)について解説します。
まず足し算引き算についてです。行列の足し引きは、同じ行数と列数の行列同士でないとできません。とはいえ仕組みは単純。それぞれの対応する成分を足し引きするだけです。

簡単ですね。

次は行列Aに定数kをかける場合ですが、これも単純です。行列のそれぞれの成分にkをかけるだけなので。簡単じゃん!!ここまではね。

さて行列同士の積ですが、めっっっっっっっっっっっっちゃめんどくさいです。なんと行列同士のかけ算では、交換法則が成立しません。つまりA×B≠B×Aという状態に平気でなります。
行列同士のかけ算も出来る条件があります。行列Aのの数と、行列Bのの数が同じでなければA×Bを計算することが出来ません。

ですが心配はいりません!なぜなら今回扱う行列のかけ算は2×2と1×2の行列のみで十分だからです。心配かけてごめんちゃい。
2×2と1×2の行列のかけ算はこんな感じでいけます。

ここで注意してほしいのが、結果は2×2行列ではなく1×2行列になるということです。(m×n行列とn×l行列をかけるとm×l行列になります)
取り敢えずこれさえ覚えたら今回の行列は何とかなります。

次にベクトルについてです。ベクトルは「大きさと向きを持つ量」のことで、向きを持つ線分で表されます。
ベクトルは行列で表すことができます。x軸に沿ってa進み、y軸に沿ってb進むようなベクトルは以下のように表すことが出来ます。(この二つは演算する時の状況に応じて使い分けます)

ちなみに今回行列で図形の回転を表現しますが僕が解説しちゃうと説明に4000文字くらい要りそうなので一旦省きます。

解説おにいさん:今回の僕の出番はここまで。ありがとうございました。
私:ありがとうございました。

本題

ということで本題に入ります。
カオスゲームとは、フラクタルを描画する方法のひとつです。多角形の内部の点をランダムに、しかし一定の法則に従って選び、その点の軌道を辿るとフラクタル図形が出来るという寸法です。
あるいは、任意の点x₀を選択し、点がランダムに動くように関数を適応していくとフラクタル図形が浮かび上がってくるという方法も指すことがあります。
分かりやすくするために順序立てて話しましょう。まず前者の方法を解説します。
※あんだけ語っておいてなんですが、行列はここではいったん登場しません。

~~~~

ということで解説します。まず、正三角形とその内部にある一つの点を考えます。

誰がなんと言おうとこれは正三角形です

次に頂点をひとつランダムに選びます。そしてその頂点と点を結んだ中点を取ります。

誰がなんと言おうとこれは中点です

そしてまた新しく頂点をランダムに選び、その点と選んだ頂点の中点を更に取ります。

またまた頂点をランダムに選び、選んだ頂点と中点を結び、その中点を更に取ります。

この流れをずっと繰り返していくと、最終的にあるフラクタル図形が完成します。何だと思いますか。
ヒントは、三角形です。

ヒントとなる途中経過です。


ちょっと進めました。だいたいわかったかな?

もう分かったと思います。形見えちゃってますもんね。
正解は…シェルピンスキーのギャスケットです!

おーーー

三角形の頂点をランダムに選んでいるだけでフラクタルが勝手にできてくれるなんてすごい世の中になりましたね。
ちなみに描画に使ったScratchプロジェクトを公開しています。描画される過程をもっと詳しく見たいという人はこちらを見てください。

https://scratch.mit.edu/projects/1051173480/

ちなみに中点ではなく他の点を取るように変えてみると図形の形が変化します。例えば(頂点までの距離):(前の点までの距離)が0.4 : 0.6になるような点を取ると図形がなんかまばらになり

逆に0.6:0.4になるような点を取るとなんか変になります。シェルピンスキーのギャスケットの1つ1つの三角形が異常にデカくなったみたいな感じです。

また、点の位置を変えてみると、シェルピンスキーのギャスケットの正三角形じゃない版が出てきます。

頂点の数を増やすこともできます。こんなふうに。

pentaflakeという名前がある
これはhexaflake

しかし点を4つにすると….

になります。
ということでちょっと面白いルールを導入してみましょう。「同じ頂点を二回連続で選んではいけない」というように変更すると、どうなるでしょうか。

一気にきれいになりましたね。

他にもいろいろ工夫してみます。「左上の点を選んだあとは右下の点を選んではいけない」という風にするとこうなり、

「対角線にある点を選んではいけない」とするとこうなります。

このように、点の選び方を変えると色々な面白い図形が現れるんですね。

本²題

ということでカオスゲームの二つ目の意味である「任意の点x₀を選択し、点がランダムに動くように関数を適応していくとフラクタル図形が浮かび上がってくる」という方法について解説しようと思います。
ここで活躍するのが行列です。描画用の関数を作るときに行列が必要になるのです。
だらだら話してもしょうがないので実例をあげながら話していきましょう。

コッホ曲線を例にとります。#3「Y-E-s-O-d²⁄₂」で見た通り、コッホ曲線は四つの図形変換を用いて表されます。
①元の図形を⅓に縮小する変換
②元の図形を⅓に縮小し、左に60度回転させ、右に⅓平行移動させる変換
③元の図形を⅓に縮小し、右に60度回転させ、右に½、上に$${\frac{\sqrt{3}}{6}}$$平行移動させる変換
④元の図形を⅓に縮小し、右に⅔平行移動させる変換
※回転の軸は左端とする

この変換を式で表すことが出来ます。図形上の点Pを入れると移動させた図形の対応する点Qになるような式を考えます。
①は簡単ですね。大きさを⅓に縮小するので、x、yともに⅓になればOKです。行列を使って表すとこうなります。

これを計算すると、$${\binom{\frac{1}{3}x}{\frac{1}{3}y}}$$となります。xとyが両方⅓になっていますね。
④はこれを右に(x軸に沿ってプラスの方向に)⅔平行移動させるので、こうなります。

さて②と③はややめんどくさいです。回転はどうすればよいのでしょうか。ここで行列が本領発揮です!
点Pの座標x,yを代入すると原点を中心に反時計回りにθ度回転するような式は、こんな風に表すことが出来ます。

(ちなみにsin、cosについてですが説明してるとめっちゃ長くなるので興味があれば各自調べてください。)
②では60度回転させるので、θ=60を代入します。するとこのようになります

実際は大きさが⅓になるので、それぞれの成分に⅓をかけてこうなります。

そして⅓平行移動させるというわけですね。

はい。見事な②の式が完成しましたね。
最後に③です。60度回転の逆向きということなので、-60度回転と捉えられますね。
cos(-60°) = $${\frac{1}{2}}$$、sin(-60°) = $${-\frac{\sqrt{3}}{6}}$$となるので、
これはわかりますね。

ということで平行移動ですが、右に½、上に$${\frac{\sqrt{3}}{6}}$$ということで…こうですね!

合わせてこうなります。これで③の式が完成して、①②③④すべての式が出揃(そろ)いましたね。

このx,yを0,0とかにして、これらの四つの関数をランダムに選んでx,yの変化をグラフにプロットすると、コッホ曲線が出てきます。この方法でコッホ曲線を描くプログラムを書くときは行列式を展開して単純な形にすることがほとんどです。

他のフラクタルを描く式も見てみましょう。
・シェルピンスキーのギャスケットの場合

①全体を½に縮小する関数
②全体を½に縮小し、右に½平行移動させる関数
③全体を½に縮小し、右に¼、上に$${\frac{\sqrt{3}}{4}}$$平行移動させる関数
ということはこうなります。

・レヴィC曲線の場合
左45度回転と右45度回転しかないレヴィC曲線の場合、使う式は2つだけです済みます。

こっちはかなり単純ですね。

・ドラゴン曲線の場合
こちらも使う式は二つで済みます。

レヴィC曲線の場合と似ていますが、符号や移動させる大きさが異なります。

カオスゲームを使うとフラクタルを正確に描画することが出来ますが、描画のための式を求めるのが少し難しいという欠点があります。状況に応じてカオスゲームとL-systemを使い分けるのが大事ですね。

まとめ

いかがでしたか?今回は「カオスゲーム」について解説しました。
カオスゲームは乱数を用いたフラクタルの描画方法で、頂点を選ぶものや行列を使った式への代入を繰り返すものがあるとわかりました。
頂点の選び方を変えてみると同じ頂点の配置でも違った図形が現れたり、結んだ線分の点の取り方を変えると図形の形が大きく変化するとわかりました。
後半では行列式を用いたフラクタルの描画を行いました。図形の平行移動を
行列の加算で、回転を行列のかけ算で表すのは斬新でしたね。
これらは図形上の点Pを入れると移動させた図形の対応する点Qになるような式です。そう考えると何だか式での表現がしっくりきますね。

次回更新は8/6を予定しています。次回!!!!次元!!!!!お楽しみに!!!!!!

参考にしたサイト

※この記事で用いた画像は全て自作です。

余談

ちなみに、FNFE Projectは全35回の予定です。
FNFE Projectの公式キャラクターができました。次回の更新でお披露目できたらいいなと思います。めっちゃかわいいです!!!

いいなと思ったら応援しよう!