processingでカオスと収束

画像とソースコード参照サイト様からの引用。
ソースコードに理解用のコメントを自分で加えています。
f:id:peroon:20090802230952j:image
クモみたい。以下はソースコード(そのまま動く)。

//思ったこと
//オブジェクトの動的配列はArrayListで。
//オブジェクトがどんどん増えて重くなるのが欠点か。
//random(-2,3);でバランスが取れている理由は?((-3,3)とするとアンバランスになる)
//コメントはコードから1タブおいて、//コメント。
//for()の中はキチキチ(塊で見るからそれがいいらしい)
//if()の中もキチキチ
//カオスな動きはgetX(), getY()から生まれている
//ちなみにピクセル処理をするときloadPixels(), pixels[], updatePixels()を使うのは基本(速い)


ArrayList aPoints;  //配列の宣言

void setup() {  //初期設定
  frameRate(120);  //フレームレート
  size(640,480,P3D);  //ステージサイズの設定
  background(255);  //ステージの背景色
  aPoints = new ArrayList();  //PointObject格納用配列
}

void draw() {  //この関数をループします
  aPoints.add(new PointObject());  //新しいPointObjectを作成して配列に格納
  //
  loadPixels();  //ピクセルを処理する前のおまじない
  for (int i=0;i<aPoints.size();i++) {
    PointObject po = (PointObject) aPoints.get(i);  //i番目のオブジェクトを取り出す
    po.update();//座標更新
    int xx = po.getX();
    int yy = po.getY();
    if (xx<0||xx>=width||yy<0||yy>=height) {  //PointObjectの位置が端まで来ていたら
      aPoints.remove(i);  //PointObjectを削除
    } else {
      pixels[xx+yy*width] = color(0,0,0);  //座標(x,y)を黒く塗る
    }
  }
  updatePixels();  //ピクセルへの処理を反映させるためのおまじない
}



class PointObject {  //PointObjectクラス
  int xx;
  int yy;
  float ss;
  float dss;
  float vx;
  float vy;
  float rr;
  
  PointObject() {  //コンストラクタ 初期設定
    xx = width/2;
    yy = height/2;
    vx = random(-2,3);
    vy = random(-2,3);
    ss = 0;
    dss = PI/random(-36,36)/4;//-20~20度(ほぼ-0.3~0.3) //ぐるんぐるん度
    rr = random(20,80);//半径
  }
  void update() {  //座標情報の更新
    xx+=vx;
    yy+=vy;
    ss+=dss;
    rr+=(0-rr)/50;//半径減衰
  }
  int getX() {  //X座標を返す
    return int(xx+cos(ss)*rr);
  }
  int getY() {  //Y座標を返す
    return int(yy+sin(ss)*rr); 
  }
}