my naive clifford attractor

Clifford Attractorの定義に従って、
何も考えずに実装するとこのようになった。
f:id:peroon:20090803035112j:image
ソースコードはこれだけ。

float a,b,c,d;
float X,Y;
float factor = 50;

void setup(){
  size(640, 480);
  background(255);
  a = random(-3, 3);
  b = random(-3, 3);
  c = random(-3, 3);
  d = random(-3, 3);
  X = random(-3, 3);
  Y = random(-3, 3);
}

void draw(){
  noStroke();
  stroke(0, 100);
  fill(255, 10);
  //rect(0, 0, width, height);
  
  translate(width/2, height/2);
  float XX = sin(a*Y) + c*cos(a*X);
  float YY = sin(b*X) + d*cos(b*Y);
  point(XX*factor, YY*factor);
  X = XX;
  Y = YY;
}

f:id:peroon:20090803035112j:image
点の集合のように見える。
これは1点だけランダムに決めて、
あとはCilfford Attractorの更新式で
点の座標を変化させてプロットしたものだ。


すると、点の集合になった。
1つ上の実装では初期点を5000ランダムにとって、
それぞれを描画することで点ではなく線で見えるようにしている。


また、Z方向を定義し、Z座標を使って
色を変化させることで魅力的な画像にしている。


今回の実装ではpoint()を使ったが、重たかった。
1つ上の実装ではbufferにある程度書き込んでから
画面に反映させるようにして高速化している。
また、PGraphics使っている。
だから5000点でも動いている。


1つ上の例がすごくいい出来なので
私がシンプルに実装する意味がなさそうに思えたが、
実際にやってみると、
1つ上の例がどれだけ良いものかがわかってきて、
より深い理解ができた。