Clifford AttractorをopenFrameworkで実装する

2017/03/27

openFrameworks

Clifford Attractor from rystylee on Vimeo.

カオス・アトラクタの一種であるClifford AttractorをopenFrameworksで実装してみました。
ある特定のシンプルな数式によって得られた計算結果をプロットしていくことでまれに複雑なパターンが生まれることがあり、それをカオス・アトラクタ、もしくはストレンジ・アトラクタと呼びます。

今回のClifford Attractorは以下の式で表されます。
Xn+1 = sin( a * Yn ) + c * cos( a * Xn )
Yn+1 = sin( b * Xn ) + d * cos( b * Yn )

ここでのa, b, c, dは係数でありこれらの値を変化させると驚くほど多彩で複雑なグラフィックが得られます。
今回はoFで実装しましたが基本的には数式を計算して座標に格納していくだけなのでProcessingとかでも考え方は同じです。お好きな環境でお試しください!!

実装に関しては、座標を計算して配列に格納、vboMesh.draw()でpoint描画するだけ。
係数a, b, c, dとか色とかglPointSizeはofxGuiからスライダーで調整できるようにしているので、いろいろ動かしてみて美しい形を模索します。
以下、コードの抜粋。

このようなシンプルな数式でこんなにも美しい図形が現れるのが不思議でなりません。
カオス・アトラクタ系は好きなひとはすごい好きそう。

記事の冒頭にのせた動画はClifford Attractorの数式における係数を滑らかに変化させることでアニメーションにしています。
アニメーションにするととても奇妙な動きを見せ、ストレンジ・アトラクタと呼ばれる所以を感じられると思います。
動画ではアニメーションしたかったので頂点数は40万個にしていますが、動きをなくしてもっと頂点数を増やせばさらに滑らかなグラフィックが得られます。
載せてる画像は座標更新をストップして頂点数を1000万個にした結果。かなーり重いのでアニメーションはきびしい。。

また、カオス・アトラクタは他にもいろいろな種類が存在し、基本的にはこの数式を書き換えるだけで実装できます。

Lorenz Attractorと#openFrameworksの間にスペースを入れ忘れたのめっちゃ気になる。。
これらの数式はググれば出てきますのでお試しあれ🙏

わりとお手軽に見応えのある絵が出力されるので、みなさんぜひ書いてみてください。ではでは。