モノクロタイム

I'm from the future!

ジェネラティブアート(普及版)読む・Part3,Chapter8

なんだかんだで最後の章です. 長かったような,短かったような.

Chapter8 フラクタル

Chapter8では,Chapter6で学んだオブジェクト指向を使用してフラクタル芸術について学んでいく.

因みに私は大学の物理の授業で少しフラクタルについて勉強したくらいで,詳しくは知らない.

本書によると,フラクタルとは

  • 沢山のレベルで反復する形やパターン

  • 必ずしも異なるスケールで同一である必要はない

  • ある特定の種類の自己相似構造を共有している

ということらしい.

これまでfor文やwhile文などの繰り返し命令を学んできたが,コードでフラクタルを再現するには,無限の再帰的な繰り返しを行う必要がある.

無限の繰り返しを行うようなコードは以下の様なコードで,これはデバッグ中止ボタンをクリックしないと止まらないようなループ文である.

int x = 1;
while (x>0) {
    x++;
 }

このようなループ文を多用し,フラクタルやそれに準ずるような図形を生み出していく.

自己相似性のコーディング

自分に相似した図形を生み出すためには,単純に自分のコピーをたくさん作るオブジェクトを定義すればよい.

本書では,この自己相似性をコーディングで表現するための効果的な例として,木の幹と枝を挙げている.

f:id:yomoyamareiji:20150303180749p:plain

幹を描くようなオブジェクトのインスタンスを作成する. これを親として,子を3回に渡って繰り返し描画することで木の枝のような描画をすることができた.

もちろん,この3回と言うのはループの上限を決めているから3回なのであって,制限を加えなければ永遠に描画を続ける.

さらに毎フレームごとの処理も行わないので,静止画である.

アニメーション処理を加え,子の世代ごとに線の太さやアルファ値を変えると,蒸気機関車の車輪同士をつなぐ部分(本には宇宙のゼンマイ時計と書いているけど,自分にはこのように見える)のような絵を描くことができた.

f:id:yomoyamareiji:20150303182012p:plain

実際は枝同士の接続部分を中心として幹の長さを変えながらそれぞれぐるぐると回転している.

さらに世代をドンドン増やし,線を細くする.

f:id:yomoyamareiji:20150303193857p:plain

木の幹というよりは,木の葉の部分のよう.

これもアニメーションで動かしているのだが,処理が追いつかないので5,6秒毎にちょっとだけ図形が変わるといった程度だ.

サトクリフ五角形

初めて聞いた言葉だ.本書によると,

サトクリフは、まず五角形を描いて、その 5 つの辺のそれぞれの中点から垂線を引き、この垂線上の点を結べば別の五角形を作れると言っています。こうすれば、形状の残りの部分も同じく、さらなる五角形に分けられるので、結局それぞれの五角形がさらに 6 個のサブ五角形に分けられます。サブ五角形の内にはさらにサブサブ五角形ができるので、この分割を無限小に向かって繰り返すことができます。

要するに,五角形をさらに五角形で区切り,その区切った五角形の中身を五角形で区切る…といったところだろうか.

これから,サトクリフ五角形を描くための説明が続く.

f:id:yomoyamareiji:20150303195548p:plain

まず五角形を描き,

f:id:yomoyamareiji:20150303201131p:plain

各辺の中心を求める.

f:id:yomoyamareiji:20150303201520p:plain

辺の中心から五角形の内部に向かって辺と垂直な線を描く.

f:id:yomoyamareiji:20150303201807p:plain

再帰的に実行することで,内部に沢山の五角形を生成することが出来る.

f:id:yomoyamareiji:20150303202223p:plain

中心だけではなく,他の五角形の中にも五角形を描けば,完全なサトクリフ五角形を生成できる.

五角形には素敵な対称性がありますが、最初の形が 5 つの辺を持たなければならないという理由はありません。

ということで,5つの辺以上のサトクリフ五角形を描く方法も.

f:id:yomoyamareiji:20150303203128p:plain

f:id:yomoyamareiji:20150303203153p:plain

アニメーションなので,形がどんどん変わっていく.

このコードは変更できる部分がたくさんあって,例えば五角形ではなく六角形にしたり,回転するスピードを変えたり,世代の数を(パソコンが死なない程度に)増やしてみたり,新たなアートを作り出すための基板となるようなコードである.

中身を変更して,色々な図形を描くのも面白いかもしれないけど,まずはグレースケールではなくカラーの線を引くところから.

モノクロでも十分キレイだけど,やはりアートというからには色付けも行っていきたいところ.(もちろん予測不可能な)

まとめ

序盤で自然の生み出すカオスという言葉が出てきたけど,このフラクタルがまさに自然の生み出すカオスであって,これをコンピュータで表現するには,まさに予測不可能性や不完全性を何らかの形で方程式に組み込む必要がある.

その何らかの形というのは,Processingに限らず多くのプログラミング言語で扱われている乱数だとかループ文だとかで表現をしてきた.機械の中に予測不可能性や不完全さを許容する余地を残しておくことで,隅から隅までプログラミングされたアートとはまた違った,先が見えない不安や好奇心が生み出す美しさにつながっていくのではないだろうか.と思った.

ジェネラティブアート,以上で読了です.

感想

役者あとがきにもあるけど,所謂「プログラミング言語を身につけるための本ではない」ということが一番の印象.

「プログラミングを学ぶ」ことが目的となっていて,実際プログラミングでどういったことができるようになるか?といったアフターサポートが無い本はProcessingに限らず多くの技術書が当てはまる.

プログラミングをしたことがない人にとって,プログラミングの目的が見えない本は学ぶ時に不安しか無い.と思う.自分はそうだった.

しかしこの本は,Processingというコーディング→即確認ができる言語とアートという老若男女が取り組みやすい題材を組み合わせることで,プログラミングで何が出来るか,どうすればこういった絵が描けるようになるかといった説明が必要最小限で述べてあり,非常にわかりやすかったのではないかと思う.

プログラミングをやったことがない人,若しくはプログラミングで何か作ってみたいけど何から始めればいいかわからない人におすすめの本.

プログラミングができるorProcessingをかじったことがある程度の人は,中盤の所謂Processingのプログラミングの説明部分が少し退屈に感じるかもしれない.

しかし,ワンランク上の描画をするスキルが身につくので,コードを打ち込みつつ,説明部分は流し読みしながら勉強していけば良いのではないだろうか.

とにかく,普及版はオトクで内容が詰まった良書です. 普及版を買うと,ジェネラティブアートのフルカラーpdfファイルをダウンロードすることができるので,本がモノクロなのはちょっと…という人も大丈夫です.

楽しく勉強できました!ありがとう,マット・ピアソン氏!