· 

Lorenzアトラクタ

(著)山たー

Lorenzアトラクターを描いてみた。3Dで表示させて回転させているので、少し重いかも

ソースコード

//Lorenz Attractor

float x=random(0,5);
float y=random(0,5);
float z=random(0,5);

float dx,dy,dz;
float dt=0.01;

float dx1,dy1,dz1,dx2,dy2,dz2,
      dx3,dy3,dz3,dx4,dy4,dz4;

//Lorenz equationsにおける定数
float p=10;
float r=28;
float b=8.0/3.0;

float cam=2;

ArrayList<PVector> points = new ArrayList<PVector>(); //PVectprの配列pointsを初期化

void setup(){
  size(400,400,P3D); 
}
 
void draw(){
  background(255);
  //Lorenz equations using Runge-Kutta method 
  dx1=f1(x,y)*dt;
  dy1=f2(x,y,z)*dt;
  dz1=f3(x,y,z)*dt;
  
  dx2=f1(x+dx1/2,y+dy1/2)*dt;
  dy2=f2(x+dx1/2,y+dy1/2,z+dz1/2)*dt;
  dz2=f3(x+dx1/2,y+dy1/2,z+dz1/2)*dt;
  
  dx3=f1(x+dx2/2,y+dy2/2)*dt;
  dy3=f2(x+dx2/2,y+dy2/2,z+dz2/2)*dt;
  dz3=f3(x+dx2/2,y+dy2/2,z+dz2/2)*dt;
  
  dx4=f1(x+dx3,y+dy3)*dt;
  dy4=f2(x+dx3,y+dy3,z+dz3)*dt;
  dz4=f3(x+dx3,y+dy3,z+dz3)*dt;
  
  dx=(dx1+2*dx2+2*dx3+dx4)/6;
  dy=(dy1+2*dy2+2*dy3+dy4)/6;
  dz=(dz1+2*dz2+2*dz3+dz4)/6;
  
  //微小変化を加える
  x+=dx;
  y+=dy;
  z+=dz;   
  
  points.add(new PVector(x,y,z)); //配列pointsにPVectorを加える
  
  translate(width/2,height*10/11); //PeasyCamを使用する場合は不要
  scale(6); //座標を拡大する
  rotateX(2);
  rotateZ(cam);
  //rotate(cam);
  cam+=0.01;
  noFill();
  
  float hue=0; //色相
  
  for(PVector v:points){
    stroke(hue);
    point(v.x,v.y,v.z);
  }
}

float f1(float x,float y){
  return -p*x+p*y;
}

float f2(float x,float y,float z){
  return -x*z+r*x-y;
}

float f3(float x,float y,float z){
  return x*y-b*z;
}