// Lorenz Attractor animation, Evgeny Demidov, 25 June 2000 import vrml.*; import vrml.field.*; import vrml.node.*; import java.awt.Color; public class LorenzAn extends Script { int n, it; float[][] p; public void processEvent(Event e){ if(e.getName().equals("go")){ if( ++it >= n ) it = 0; ((SFVec3f) ((Node) ((SFNode) getField("Tracer")).getValue()). getExposedField("translation")).setValue( p[it] ); } } public void initialize(){ n = ((SFInt32) getField("N")).getValue(); p = new float[n][3]; float[][] col = new float[n][3]; double dt = ((SFFloat) getField("dt")).getValue(), dt2 = dt/2.; Color HSBcol = new Color(0); float Norm = 0.833F / n; int[] c = new int[n]; double x=1.0, y=0., z=0., x1,y1,z1, xt,yt,zt; for (int i= 0; i< n; i++) { xt = x1 = fx(x,y,z)*dt2; yt = y1 = fy(x,y,z)*dt2; zt = z1 = fz(x,y,z)*dt2; xt = fx(x+xt, y+yt, z+zt)*dt2; x1 += xt+xt; x1 += x1; yt = fy(x+xt, y+yt, z+zt)*dt2; y1 += yt+yt; y1 += y1; zt = fz(x+xt, y+yt, z+zt)*dt2; z1 += zt+zt; z1 += z1; xt = fx(x+xt, y+yt, z+zt)*dt; x1 += xt+xt; yt = fy(x+xt, y+yt, z+zt)*dt; y1 += yt+yt; zt = fz(x+xt, y+yt, z+zt)*dt; z1 += zt+zt; x1 += fx(x+xt, y+yt, z+zt)*dt; y1 += fy(x+xt, y+yt, z+zt)*dt; z1 += fz(x+xt, y+yt, z+zt)*dt; p[i][0] = (float)(x += x1/6.); p[i][1] = (float)(y += y1/6.); p[i][2] = (float)(z += z1/6.); HSBcol = Color.getHSBColor( Norm*i, 1.0F, 1.0F); col[i][0] = ((float)HSBcol.getRed()) / 255.0F; col[i][1] = ((float)HSBcol.getGreen()) / 255.0F; col[i][2] = ((float)HSBcol.getBlue()) / 255.0F; c[i] = i;} ((MFVec3f) ((Node) ((SFNode) getField("ILScoord")).getValue()). getExposedField("point")).setValue(p); ((MFColor) ((Node) ((SFNode) getField("ILScolor")).getValue()). getExposedField("color")).setValue(col); ((MFInt32) ((Node) ((SFNode) getField("ILS")).getValue()). getEventIn("set_coordIndex")).setValue(c); } double fx(double x, double y, double z){ return 3.*(y - x); } double fy(double x, double y, double z){ return -x*z + 26.5*x - y; } double fz(double x, double y, double z){ return x*y -z; } }