PCHJ02開催!
先日 @PCD_Tokyo さん主催の Processing Community Hangout Japan #02 ( #pchj02 )がオンラインで開催されました。(Youtubeのアーカイブはこちら)
このイベントの中で「七夕」のスケッチを公募するというものがありました。(集まった作品は、@PCD_Tokyoさんのモーメントにまとまっています。皆さん凄い!)
もちろん私もスケッチ公募に参加し、せっかくなので #つぶやきProcessing のレギュレーションで作品を創りました。
イベントの中で各作品の鑑賞会&解説会があったのですが、私の作品については「解説が難しいですねー^^;」ということだったので、せっかくなので解説記事を書こうかな、と思ったのが今回の主題です。
ソース圧縮しているし、ぱっと見何やっているかわからないし、むしろ初見でこれの解説できたら変態だ。。
解説

七夕がテーマでしたので「織姫と彦星が再会を喜び、天の川を越えて手を差し伸べる」を表現しました。
読みやすいソースコード
普通にプログラムを書くと下記のような感じになります。これで多少は分かりやすくはなったのではないでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
size(1920, 1080); clear(); float x = 1; float y = 1; // 1セット目(手) for (int i = 0; i < 4000000; i++) { stroke(192, 128, 64, 10); float newX = cos(x * y) / y / .8; float newY = sin(x + y) + cos(x) / y; point(newX * 200 + 960, newY * 200 + 540); x = newX; y = newY; } // 2セット目(天の川) for (int i = 0; i < 4000000; i++) { stroke(160, 192, 255, 16); float newX = cos(x + y)/ y * 3 * sin(y * sin(y)); float newY = tan(y) - sin(x) / y; point(newX * 200 + 960, newY * 200 + 540); x = newX; y = newY; } |
概要(要は何をやっているのか)
「400万個の薄い点を、数式に基づいて座標を計算して打つ」を2セット行っています。1セット目が左上と右下から延びる肌色の手の部分。2セット目が中央に上下に走る青白い天の川の部分です。
詳細(要はどうなっているのか)
xとyの座標をカオス的なルールに基づいて計算して、計算結果の位置に点を打っていきます。
1セット目は
1 2 |
float newX = cos(x * y) / y / .8; float newY = sin(x + y) + cos(x) / y; |
2セット目は
1 2 |
float newX = cos(x + y)/ y * 3 * sin(y * sin(y)); float newY = tan(y) - sin(x) / y; |
という計算を使います。前回の計算結果を使って次の座標を求めるという方式で、さらにxの計算にはyが、yの計算にはxが含まれており、これによりカオス的なふるまいを引き起こしています。
計算された結果はすごく小さい値なので、200倍に拡大して、point()で点を打ちます。
1 |
point(newX * 200 + 960, newY * 200 + 540); |
色は1セット目がstroke(192, 128, 64, 10)、2セット目がstroke(160, 192, 255, 16)と、第四引数のαが小さくなっています。つまりものすごく薄い点になるのですが、これを400万個打つと、点がたくさん打たれる場所とそうでない場所に分かれるため、綺麗なグラデーションが見えてくるようになります。
まとめ
カオスの数式は結果がほとんど予測できないので、試行錯誤が何百回も必要になります。今回、天の川の部分はそこそこの回数でできたのですが、手の部分は2時間ひたすら数式をコネコネして、いい感じの絵が出てくる式を探し当てました。
あと、見直してて分かったのですが、投稿したソースの
1 |
(i>C?200:200) |
の部分は無駄でした…。10文字損したなぁ。。
次回のHangoutは、#つぶやきProcessing がテーマだそうです。30分コーディングチャレンジ企画に参加することにしたので、今から実装力とトーク力を鍛えておこうと思います!