/** removes one layer of surface voxels */ public void makeOneIteration(int nnCount) { // m_markedCount = 0; // long t0 = currentTimeMillis(); // if(m_surfaceMask != null){ // we have surface voxels stored on previous step // scan only surface voxels // processSurfaceVoxel(x,y,z); // } else { // no surface calculated yet. Scan the whole grid to find marked voxels m_grid.find(VoxelClasses.INSIDE, new SurfaceVoxelsCollector(m_grid, m_surfaceMask, nnCount)); // } // set marked voxels as OUTSIDE m_surfaceMask.find(VoxelClasses.INSIDE, new VoxelStateSetter(m_grid, Grid.OUTSIDE)); m_surfaceMask.clear(); }
public AttributeGrid execute(AttributeGrid grid) { printf("ErosionMask.execute()\n"); m_grid = grid; int nx = grid.getWidth(); int ny = grid.getHeight(); int nz = grid.getDepth(); m_surfaceMask = new GridBitIntervals(nx, ny, nz); if (m_nnCount == 0) { // spherical erosion m_grid.find( VoxelClasses.INSIDE, new CustomVoxelsCollector( m_grid, m_surfaceMask, MaskFactory.makeBall(m_iterCount), m_voxelChecker)); // m_grid.find(VoxelClasses.INSIDE, new SphericalVoxelsCollector(m_grid, m_surfaceMask, // m_iterCount, m_voxelChecker)); // set marked voxels as OUTSIDE m_surfaceMask.find(VoxelClasses.INSIDE, new VoxelStateSetter(m_grid, Grid.OUTSIDE)); m_surfaceMask.clear(); } else { for (int i = 0; i < m_iterCount; i++) { makeOneIteration(getCount(i)); } } m_grid = null; m_surfaceMask = null; return grid; }