X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fvoxel%2FMarchingCubes.java;h=3112d8d163d46139892707a9a694e434b87c22cb;hp=cccbecf0e0eca749026ffa3116a34011d5a52fb7;hb=76e9f9a721c31fc8c2ed671ebda1640534ac2f1b;hpb=03c8f8e0d33bd7ea2940151ca474242bc9920315 diff --git a/src/edu/berkeley/qfat/voxel/MarchingCubes.java b/src/edu/berkeley/qfat/voxel/MarchingCubes.java index cccbecf..3112d8d 100644 --- a/src/edu/berkeley/qfat/voxel/MarchingCubes.java +++ b/src/edu/berkeley/qfat/voxel/MarchingCubes.java @@ -23,30 +23,138 @@ import edu.berkeley.qfat.geom.*; // ////////////////////////////////////////////////////////////////////////////////////// -public abstract class MarchingCubes { - - private int iEdgeFlags; +public class MarchingCubes { private static class GLvector { public double fX; public double fY; - public double fZ; + public double fZ; + public String toString() { + return "("+fX+","+fY+","+fZ+")"; + } }; - GLvector sSourcePoint[] = new GLvector[3]; + /** march iterates over the entire dataset, calling vMarchCube on each cube */ + public static void march(VoxelData voxels, Mesh mesh) { march(voxels, 0, mesh); } + public static void march(VoxelData voxels, double threshold, Mesh mesh) { + int initialTriangles = mesh.numTriangles(); + double scaleX = (voxels.getMaxX() - voxels.getMinX()) / (double)voxels.getNumSamplesX(); + double scaleY = (voxels.getMaxY() - voxels.getMinY()) / (double)voxels.getNumSamplesY(); + double scaleZ = (voxels.getMaxZ() - voxels.getMinZ()) / (double)voxels.getNumSamplesZ(); + for(int iX = 0; iX < voxels.getNumSamplesX(); iX++) { + System.out.print("\r"); + for(int i=0; i<78; i++) System.out.print(' '); + System.out.print("\r"); + System.out.print(Math.ceil((iX/((double)voxels.getNumSamplesX()))*100) + "% marched, " + + (mesh.numTriangles()-initialTriangles) + " triangles"); + for(int iY = 0; iY < voxels.getNumSamplesY(); iY++) + for(int iZ = 0; iZ < voxels.getNumSamplesZ(); iZ++) + march(voxels, mesh, threshold, + iX*scaleX + voxels.getMinX(), + iY*scaleY + voxels.getMinY(), + iZ*scaleZ + voxels.getMinZ(), + scaleX, scaleY, scaleZ); + } + System.out.print("\r"); + for(int i=0; i<78; i++) System.out.print(' '); + System.out.print("\r"); + System.out.println("done marching."); + } + + /** performs the Marching Cubes algorithm on a single cube */ + static void march(VoxelData voxels, Mesh mesh, double threshold, + double fX, double fY, double fZ, + double scaleX, double scaleY, double scaleZ) { + int iCorner, iVertex, iVertexTest, iEdge, iTriangle, iFlagIndex, iEdgeFlags; + double fOffset; + GLvector sColor; + double afCubeValue[] = new double[8]; + GLvector asEdgeVertex[] = new GLvector[12]; + GLvector asEdgeNorm[] = new GLvector[12]; + + for(int i=0; i= threshold) + iFlagIndex |= 1<