Mod: Coding Challenge #12: The Lorenz Attractor in Processing
数式を使って描画する方向では、ローレンツ・アトラクターは結構有名。
ローレンツ方程式 - Wikipedia The Lorenz Attractor, a thing of beauty
上のPaul Bourkeさんが書いてるエントリに載っているCでの実装をProcessingでポーティングしたような感じ。例によってPeasyCamを使っているのでGIFで。
このへんのフラクタルやカオスをプログラミングで使用する例は、C→Processingで永松さんがやっている。綺麗。
フラクタル、カオスをProcessingで記述する – 永松 歩 | Ayumu Nagamatsu
コード
import peasy.*; float x = 0.01; float y = 0; float z = 0; float a = 10; float b = 28; float c = 8.0/3.0; float scale = 10; ArrayList<PVector> points = new ArrayList<PVector>(); PeasyCam cam; // setup関数 : 初回1度だけ実行される void setup() { size(960, 540, P3D); // ウィンドウサイズを960px,540pxに colorMode(HSB, 360, 100, 100); // HSBでの色指定にする cam = new PeasyCam(this, 500); background(0, 0, 0); } // draw関数 : setup関数実行後繰り返し実行される void draw() { background(0, 0, 0); float dt = 0.01; float dx = (a * (y - x)) * dt; float dy = (x * (b - z) - y) * dt; float dz = (x * y - c * z) * dt; x = x + dx; y = y + dy; z = z + dz; points.add(new PVector(x, y, z).mult(5)); translate(0, 0, -80); noFill(); stroke(0, 0, 100); float hue = 0; beginShape(); for (PVector p : points) { stroke(hue, 80, 100); vertex(p.x, p.y, p.z); //PVector offset = PVector.random3D(); //offset.mult(0.1); //p.add(offset); hue = (hue + 0.1)%360; } endShape(); }