(著)山たー
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; }
コメントをお書きください