};
/** march iterates over the entire dataset, calling vMarchCube on each cube */
- public static void march(SampledField sampledField, double targetValue, int iDataSetSize, double fStepSize, Mesh mesh) {
+ public static void march(SampledField sampledField, double threshold, int iDataSetSize, double fStepSize, Mesh mesh) {
int iX, iY, iZ;
int initialTriangles = mesh.numTriangles();
for(iX = 0; iX < iDataSetSize; iX++) {
(mesh.numTriangles()-initialTriangles) + " triangles");
for(iY = 0; iY < iDataSetSize; iY++)
for(iZ = 0; iZ < iDataSetSize; iZ++)
- march(sampledField, mesh, targetValue, iX*fStepSize, iY*fStepSize, iZ*fStepSize, fStepSize);
+ march(sampledField, mesh, threshold, iX*fStepSize, iY*fStepSize, iZ*fStepSize, fStepSize);
}
System.out.print("\r");
for(int i=0; i<78; i++) System.out.print(' ');
}
/** performs the Marching Cubes algorithm on a single cube */
- static void march(SampledField sampledField, Mesh mesh, double targetValue, double fX, double fY, double fZ, double fScale) {
+ static void march(SampledField sampledField, Mesh mesh, double threshold, double fX, double fY, double fZ, double fScale) {
int iCorner, iVertex, iVertexTest, iEdge, iTriangle, iFlagIndex, iEdgeFlags;
double fOffset;
GLvector sColor;
// Find which vertices are inside of the surface and which are outside
iFlagIndex = 0;
for(iVertexTest = 0; iVertexTest < 8; iVertexTest++) {
- if (afCubeValue[iVertexTest] <= targetValue) {
+ if (afCubeValue[iVertexTest] >= threshold) {
iFlagIndex |= 1<<iVertexTest;
}
}
// If there is an intersection on this edge
if ((iEdgeFlags & (1<<iEdge))==0) continue;
fOffset = fGetOffset(afCubeValue[ a2iEdgeConnection[iEdge][0] ],
- afCubeValue[ a2iEdgeConnection[iEdge][1] ], targetValue);
+ afCubeValue[ a2iEdgeConnection[iEdge][1] ], threshold);
asEdgeVertex[iEdge].fX = fX + (a2fVertexOffset[ a2iEdgeConnection[iEdge][0] ][0] + fOffset * a2fEdgeDirection[iEdge][0]) * fScale;
asEdgeVertex[iEdge].fY = fY + (a2fVertexOffset[ a2iEdgeConnection[iEdge][0] ][1] + fOffset * a2fEdgeDirection[iEdge][1]) * fScale;
if (points[0].equals(points[1])) continue;
if (points[0].equals(points[2])) continue;
if (points[1].equals(points[2])) continue;
- mesh.newT(points[0], points[1], points[2], norm.norm(), 1);
+ mesh.newT(points[0], points[1], points[2], norm.norm().times(-1));
}
}