Clifford Attractor

f:id:peroon:20090803032229j:image
f:id:peroon:20090803032230j:image
ソースコード参照サイト様のもので、
私が理解用にコメントを加えています。
クリックで再描画、
スペースで保存します。
保存形式はtifからjpgに私が変更しました。
そのまま動くソースコード

/**
  Clifford A. Pickover's attractor
  Made with Processing 118
*/
float a,b,c,d;//
int numOfDots = 5000;//
int interval = 0; 
float keyColor;//
float factor = 300;//size
MyDot[] myDots = new MyDot[numOfDots];//
PGraphics imgBuffer;//3d buffer?

void setup(){
  size(960,540);//
  factor = height*0.3;  //size
  colorMode(HSB);//
  background(0);//
  keyColor = random(255);//
  a = random(-3.0,3.0);//
  b = random(-3.0,3.0);//
  c = random(-3.0,3.0);//
  d = random(-3.0,3.0);//
  for(int i=0;i<numOfDots;i++){//
    myDots[i] = new MyDot();//
  }
  imgBuffer = createGraphics(width,height,P3D);//
  imgBuffer.beginDraw();//
  imgBuffer.background(0);//
  imgBuffer.endDraw();//
}

void draw(){
  imgBuffer.beginDraw();//
  imgBuffer.translate(width/2,height/2);//
  for(int i=0;i<numOfDots;i++){//
    myDots[i].update();//
  }
  imgBuffer.endDraw();//
  
  //write per 10 times
  if(interval > 10){
    interval = 0;
    //image(imgBuffer, 0, 0);
    blend(imgBuffer, 0, 0, width, height, 0, 0, width, height, ADD);//imgBufferの画像を、画面に反映
    imgBuffer.beginDraw();
    imgBuffer.background(0);//これを消すとすぐ明るくなる。。。//なるほど、ImgBufferはリセットするのか
    imgBuffer.endDraw();
  }
  interval++;
  //println(interval);
}



//ok
void mouseReleased(){
  reset();
}


//ok
//save image
void keyPressed(){
  if(!online){
    if(key == ' '){
      String outTifName ="attractor"+"_"+nf(year(),4)+nf(month(),2)+nf(day(),2)+"_"+nf(hour(),2)+nf(minute(),2)+nf(second(),2)+".jpg";//拡張子をtifからjpgに変更しました
      save(outTifName);
    }
  }
}


//ok
void reset(){
  a = random(-3.0,3.0);
  b = random(-3.0,3.0);
  c = random(-3.0,3.0);
  d = random(-3.0,3.0);
  keyColor = random(0,255);
  for(int i=0;i<numOfDots;i++){
    myDots[i].init();
  }
  background(0);
  imgBuffer.beginDraw();
  imgBuffer.background(0);
  imgBuffer.endDraw();
}



class MyDot{
  float x,y,z;
  float xn,yn,zn;
  int age = 0;  //?
  
  MyDot(){
    x = random(-1.0,1.0);
    y = random(-1.0,1.0);
    z = random(-1.0,1.0);
  }
  
  void update(){
    xn = sin(a*y) - cos(b*x);
    //yn = z*sin(c*x) - cos(d*y);
    yn = sin(c*x) - cos(d*y);
    zn = sin(x);
    x = xn;
    y = yn;
    z = zn;
    imgBuffer.stroke(keyColor,((-1*zn*128)+128),75,10);
    imgBuffer.point(x*factor,y*factor,z*factor);  
    if(age > 100){
      init(); 
    }
    age++;
  }
  
  void init(){
    age = 0;
    x = random(-1.0,1.0);
    y = random(-1.0,1.0);
    z = random(-1.0,1.0);
  }
}