/*===============================================================*/ void MiddlePoint(int p1,int p2,int CurrentLevel) { int middle; middle=(p1+p2)/2; if(CurrentLevel>MAX_LEVEL) return; if((middle!=p1) && (middle!=p2)) { Array[middle]=(Array[p1]+Array[p2])/2.0+Delta[CurrentLevel]*Gauss(); MiddlePoint(p1,middle,CurrentLevel+1); MiddlePoint(middle,p2,CurrentLevel+1); } }
/*===============================================================*/ void CreateFractalImage(int y1,int y2) { int N,i; N=(int)pow(2.0,(double)MAX_LEVEL); for(i=0;i<MAX_LEVEL;i++) Delta[i]=Sigma*pow(0.5,i*H)*sqrt(1.0-pow(2.0,2*H-2)); Array[0]=y1; Array[N]=y2; MiddlePoint(0,N,0); }
void VoxelTerrain::BuildCubeGrid(float x, float y, float z, float l, float f1, float f2, float f3, float f4, float f5, float f6, float f7, float f8){ float vcx=x; float vcy=y; float vcz=-z; tmat.TransformVec(vcx, vcy, vcz, 1); for (int i = 0 ;i<= 5; i++){ float d = eyepoint->frustum[i][0] * vcx + eyepoint->frustum[i][1] * vcy - eyepoint->frustum[i][2] * vcz + eyepoint->frustum[i][3]; if (d <= -l*sqrt(6)) return;//{ds=ds/10; break;} } float dx,dy,dz; float rc; /* compute distance from node To camera (approximated for speed, don't need to be exact) */ dx = abs(x - Xcf); dy = abs(y - Ycf); dz = abs(z - Zcf); rc = dx+dy+dz; if (rc*.1<=3*l){ float F[27]; F[0] =tbuffer[(int)(x-l)][(int)(y-l)][(int)(z-l)]; F[1] =tbuffer[(int)(x)][(int)(y-l)][(int)(z-l)]; F[2] =tbuffer[(int)(x+l)][(int)(y-l)][(int)(z-l)]; F[3] =tbuffer[(int)(x-l)][(int)(y)][(int)(z-l)]; F[4] =tbuffer[(int)(x)][(int)(y)][(int)(z-l)]; F[5] =tbuffer[(int)(x+l)][(int)(y)][(int)(z-l)]; F[6] =tbuffer[(int)(x-l)][(int)(y+l)][(int)(z-l)]; F[7] =tbuffer[(int)(x)][(int)(y+l)][(int)(z-l)]; F[8] =tbuffer[(int)(x+l)][(int)(y+l)][(int)(z-l)]; F[9] =tbuffer[(int)(x-l)][(int)(y-l)][(int)(z)]; F[10]=tbuffer[(int)(x)][(int)(y-l)][(int)(z)]; F[11]=tbuffer[(int)(x+l)][(int)(y-l)][(int)(z)]; F[12]=tbuffer[(int)(x-l)][(int)(y)][(int)(z)]; F[13]=tbuffer[(int)(x)][(int)(y)][(int)(z)]; F[14]=tbuffer[(int)(x+l)][(int)(y)][(int)(z)]; F[15]=tbuffer[(int)(x-l)][(int)(y+l)][(int)(z)]; F[16]=tbuffer[(int)(x)][(int)(y+l)][(int)(z)]; F[17]=tbuffer[(int)(x+l)][(int)(y+l)][(int)(z)]; F[18]=tbuffer[(int)(x-l)][(int)(y-l)][(int)(z+l)]; F[19]=tbuffer[(int)(x)][(int)(y-l)][(int)(z+l)]; F[20]=tbuffer[(int)(x+l)][(int)(y-l)][(int)(z+l)]; F[21]=tbuffer[(int)(x-l)][(int)(y)][(int)(z+l)]; F[22]=tbuffer[(int)(x)][(int)(y)][(int)(z+l)]; F[23]=tbuffer[(int)(x+l)][(int)(y)][(int)(z+l)]; F[24]=tbuffer[(int)(x-l)][(int)(y+l)][(int)(z+l)]; F[25]=tbuffer[(int)(x)][(int)(y+l)][(int)(z+l)]; F[26]=tbuffer[(int)(x+l)][(int)(y+l)][(int)(z+l)]; //fix cracks dx = abs(x - Xcf); dy = abs(y - Ycf); dz = abs(z - 2 * l - Zcf); //Back rc = dx+dy+dz; if (rc*.1>3*l){ F[1] = (f1+f2)/2; F[3] = (f1+f3)/2; F[4] = MiddlePoint(f1,f2,f3,f4); F[5] = (f2+f4)/2; F[7] = (f3+f4)/2; } dx = abs(x - Xcf); dy = abs(y - Ycf); dz = abs(z + 2 * l - Zcf); //Front rc = dx+dy+dz; if (rc*.1>3*l){ F[19] = (f5+f6)/2; F[21] = (f5+f7)/2; F[22] = MiddlePoint(f5,f6,f7,f8); F[23] = (f6+f8)/2; F[25] = (f7+f8)/2; } dx = abs(x - 2 * l - Xcf); dy = abs(y - Ycf); dz = abs(z - Zcf); //Left rc = dx+dy+dz; if (rc*.1>3*l){ F[3] = (f1+f3)/2; F[9] = (f1+f5)/2; F[12] = MiddlePoint(f1,f3,f5,f7); F[15] = (f3+f7)/2; F[21] = (f5+f7)/2; } dx = abs(x + 2 * l - Xcf); dy = abs(y - Ycf); dz = abs(z - Zcf); //Right rc = dx+dy+dz; if (rc*.1>3*l){ F[5] = (f2+f4)/2; F[11] = (f2+f6)/2; F[14] = MiddlePoint(f2,f4,f6,f8); F[17] = (f4+f8)/2; F[23] = (f6+f8)/2; } dx = abs(x - Xcf); dy = abs(y - 2 * l - Ycf); dz = abs(z - Zcf); //Up rc = dx+dy+dz; if (rc*.1>3*l){ F[1] = (f1+f2)/2; F[9] = (f1+f5)/2; F[10] = MiddlePoint(f1,f2,f5,f6); F[11] = (f2+f6)/2; F[19] = (f5+f6)/2; } dx = abs(x - Xcf); dy = abs(y + 2 * l - Ycf); dz = abs(z - Zcf); //Down rc = dx+dy+dz; if (rc*.1>3*l){ F[7] = (f3+f4)/2; F[15] = (f3+f7)/2; F[16] = MiddlePoint(f3,f4,f7,f8); F[17] = (f4+f8)/2; F[25] = (f7+f8)/2; } //Edges dx = abs(x - Xcf); dy = abs(y - 2 * l - Ycf); dz = abs(z - 2 * l - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[1] = (f1+f2)/2; } dx = abs(x - Xcf); dy = abs(y + 2 * l - Ycf); dz = abs(z - 2 * l - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[7] = (f3+f4)/2; } dx = abs(x - Xcf); dy = abs(y - 2 * l - Ycf); dz = abs(z + 2 * l - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[19] = (f5+f6)/2; } dx = abs(x - Xcf); dy = abs(y + 2 * l - Ycf); dz = abs(z + 2 * l - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[25] = (f7+f8)/2; } dx = abs(x - 2 * l - Xcf); dy = abs(y - 2 * l - Ycf); dz = abs(z - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[9] = (f1+f5)/2; } dx = abs(x + 2 * l - Xcf); dy = abs(y - 2 * l - Ycf); dz = abs(z - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[11] = (f2+f6)/2; } dx = abs(x - 2 * l - Xcf); dy = abs(y + 2 * l - Ycf); dz = abs(z - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[15] = (f3+f7)/2; } dx = abs(x + 2 * l - Xcf); dy = abs(y + 2 * l - Ycf); dz = abs(z - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[17] = (f4+f8)/2; } dx = abs(x - 2 * l - Xcf); dy = abs(y - Ycf); dz = abs(z - 2 * l - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[3] = (f1+f3)/2; } dx = abs(x + 2 * l - Xcf); dy = abs(y - Ycf); dz = abs(z - 2 * l - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[5] = (f2+f4)/2; } dx = abs(x - 2 * l - Xcf); dy = abs(y - Ycf); dz = abs(z + 2 * l - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[21] = (f5+f7)/2; } dx = abs(x + 2 * l - Xcf); dy = abs(y - Ycf); dz = abs(z + 2 * l - Zcf); rc = dx+dy+dz; if (rc*.1>3*l){ F[23] = (f6+f8)/2; } l=l/2; level+=1; BuildCubeGrid (x-l, y-l, z-l,l, F[0], F[1], F[3], F[4], F[9], F[10], F[12], F[13]); BuildCubeGrid (x+l, y-l, z-l,l, F[1], F[2], F[4], F[5], F[10], F[11], F[13], F[14]); BuildCubeGrid (x-l, y+l, z-l,l, F[3], F[4], F[6], F[7], F[12], F[13], F[15], F[16]); BuildCubeGrid (x+l, y+l, z-l,l, F[4], F[5], F[7], F[8], F[13], F[14], F[16], F[17]); BuildCubeGrid (x-l, y-l, z+l,l, F[9], F[10], F[12], F[13], F[18], F[19], F[21], F[22]); BuildCubeGrid (x+l, y-l, z+l,l, F[10], F[11], F[13], F[14], F[19], F[20], F[22], F[23]); BuildCubeGrid (x-l, y+l, z+l,l, F[12], F[13], F[15], F[16], F[21], F[22], F[24], F[25]); BuildCubeGrid (x+l, y+l, z+l,l, F[13], F[14], F[16], F[17], F[22], F[23], F[25], F[26]); level-=1; } else { float F[8]; F[0] =f1; F[1] =f2; F[2] =f3; F[3] =f4; F[4] =f5; F[5] =f6; F[6] =f7; F[7] =f8; MarchingCube (x-l, y-l, z-l,x+l,y+l,z+l, F); } }