// Fractal Terrains Hexagonal, Evgeny Demidov, 2 July 2000 - 9 May 2001 import vrml.*; import vrml.field.*; import vrml.node.*; public class TerraHex extends Script { double rnd; int n; double R(){ return rnd*(Math.random()-.5); } public void initialize(){ n = ((SFInt32) getField("N")).getValue(); iterate(); } public void processEvent(Event e){ if(e.getName().equals("step")) iterate(); } public void iterate(){ int n1=n+1, nc=n, Max=n1*n1, ncn1, i,j; rnd = ((SFFloat) getField("rnd")).getValue(); float Min=-1.0F; float[] M = new float[Max]; for (i=n+2; i < n*n1-1; i++) M[i] = Min; for (i=2*n1; i < n*n1; i+=n1) M[i] = M[i-1] = 0.0F; while ( (nc /= 2) >= 1) { ncn1 = nc*n1; for (j=ncn1; j < Max; j += ncn1+ncn1){ for (i= nc; i< n; i += nc+nc) { if (M[i+j]==Min) M[i+j] = (float)((M[i+j+nc-ncn1] + M[i+j-nc+ncn1])/2.+R()); if (M[i+j+nc]==Min) M[i+j+nc] = (float)((M[i+j+nc+ncn1] + M[i+j+nc-ncn1])/2.+R()); if (M[i+j+ncn1]==Min) M[i+j+ncn1] = (float)((M[i+j-nc+ncn1] + M[i+j+nc+ncn1])/2.+R()); } } rnd /= 2.; } float[][] col = new float[Max][3]; for (i=0; i< Max; i++){ if (M[i]<0){ M[i] = (float)(.1*Math.random()); col[i][0]=0.5F; col[i][1]=0.5F; col[i][2]=1.0F;} else if (M[i]+.5*Math.random()>2){ col[i][0]=1.0F; col[i][1]=1.0F; col[i][2]=1.0F;} else if (M[i]+.5*Math.random()>.5){ col[i][0]=0.7F; col[i][1]=0.7F; col[i][2]=0.25F;} else { col[i][0]=0.0F; col[i][1]=1.0F; col[i][2]=0.0F;} } ((MFColor) ((Node) ((SFNode) getField("IFScolor")).getValue()). getExposedField("color")).setValue(col); float[][] p = new float[Max][3]; int k=0; double dx = 4.8/n, dz = .866*dx, xo = -3.6-dx, x = xo, z = 2.078; for ( j = 0; j < n1; j++) { for ( i = 0; i < n1; i++) { p[k][0] = (float)(x += dx); p[k][2] = (float)z; p[k][1] = M[k]; k++; } x= (xo += dx/2.); z -= dz;} ((MFVec3f) ((Node) ((SFNode) getField("IFScoord")).getValue()). getExposedField("point")).setValue(p); int[] c = new int[8*n*n]; k=0; for ( j = 0; j < n; j++) for ( i = 0; i < n; i++) { c[k++] = i+n1*j; c[k++] = i+n1*j+1; c[k++] = i+n1*j+n1; c[k++] = -1; c[k++] = i+n1*j+n1+1; c[k++] = i+n1*j+n1; c[k++] = i+n1*j+1; c[k++] = -1;} ((MFInt32) ((Node) ((SFNode) getField("IFS")).getValue()). getEventIn("set_coordIndex")).setValue(c); } }