示例#1
0
void Timer::printThreadTime(std::string name, TIME_FORMAT format) const {
    double time = getThreadTime(name);
    std::cout << "Timer:";
    std::cout << name << " ";
    printLine(time,format);
    std::cout << std::endl;
}
void IsoSurfacePolygonizer::saveStatistics(double startTime) {
  m_statistics.m_threadTime   = getThreadTime() - startTime;
  m_statistics.m_vertexCount  = (UINT)m_vertexArray.size();
  m_statistics.m_cornerCount  = (UINT)m_cornerMap.size();
  m_statistics.m_edgeCount    = (UINT)m_edgeMap.size();
  m_statistics.m_hashStat     = _T("  CornerMap:") + intArrayToString(m_cornerMap.getLength())    + _T("\n")
                              + _T("  EdgeMap  :") + intArrayToString(m_edgeMap.getLength())      + _T("\n")
                              + _T("  DoneSet  :") + intArrayToString(m_cubesDoneSet.getLength()) + _T("\n");
  for(int i = 0; i < ARRAYSIZE(m_statistics.m_faceCount); i++) {
    m_statistics.m_faceCount[i] = m_faceCount[i];
  }
}
void IsoSurfacePolygonizer::polygonize(const Point3D &start
                                      ,double         cellSize
                                      ,const Cube3D  &boundingBox
                                      ,bool           tetrahedralMode
                                      ,bool           tetraOptimize4
                                      ,bool           adaptiveCellSize
                                      ) {

  const double startTime = getThreadTime();

  m_cellSize         = cellSize;
  m_boundingBox      = boundingBox;
  m_delta            = cellSize/(double)(RES*RES);
  m_tetrahedralMode  = tetrahedralMode;
  m_tetraOptimize4   = tetraOptimize4;
  m_adaptiveCellSize = adaptiveCellSize;

  m_statistics.clear();
  resetTables();

#ifdef _DEBUG
  _standardRandomGenerator->setSeed(87);
#else
  randomize();
#endif // _DEBUG

  m_start = start;
  for(int i = 0; i < 10; i++) {
    m_start = findStartPoint(m_start);
    if(putInitialCube()) {
      break;
    }
  }

  m_vertexArray.setCapacity( HASHSIZE);
  m_cubesDoneSet.setCapacity(HASHSIZE);
  m_edgeMap.setCapacity(     HASHSIZE);
  m_currentLevel = 0;
  while(hasActiveCubes()) {
    while(hasActiveCubes()) { // process active cubes until none left
      const StackedCube cube = getActiveCube();
#ifdef DEBUG_POLYGONIZER
      m_eval.markCurrentCube(cube);
#endif // DEBUG_POLYGONIZER
      const bool done = addSurfaceVertices(cube);

      if(cube.getLevel() == 0) {
        // test six face directions, maybe add to stack:
        testFace(cube.m_key.i-1 , cube.m_key.j   , cube.m_key.k   , cube, LFACE, LBN, LBF, LTN, LTF);
        testFace(cube.m_key.i+1 , cube.m_key.j   , cube.m_key.k   , cube, RFACE, RBN, RBF, RTN, RTF);
        testFace(cube.m_key.i   , cube.m_key.j-1 , cube.m_key.k   , cube, BFACE, LBN, LBF, RBN, RBF);
        testFace(cube.m_key.i   , cube.m_key.j+1 , cube.m_key.k   , cube, TFACE, LTN, LTF, RTN, RTF);
        testFace(cube.m_key.i   , cube.m_key.j   , cube.m_key.k-1 , cube, NFACE, LBN, LTN, RBN, RTN);
        testFace(cube.m_key.i   , cube.m_key.j   , cube.m_key.k+1 , cube, FFACE, LBF, LTF, RBF, RTF);
      }
      if(!done) {
        splitCube(cube);
      }
    }
    m_faceCount[m_currentLevel] = (UINT)m_faceArray.size();
    if(m_currentLevel>0) m_faceCount[m_currentLevel] -= m_faceCount[m_currentLevel-1];
    prepareNextLevel();
    m_currentLevel++;
  }
  saveStatistics(startTime);
  flushFaceArray();

#ifdef  DUMP_STATISTICS
  debugLog(_T("%s\n"), m_statistics.toString().cstr());
#endif
#ifdef DUMP_CORNERMAP
  dumpCornerMap();
#endif
#ifdef DUMP_EDGEMAP
  dumpEdgeMap();
#endif
#ifdef DUMP_VERTEXARRAY
  dumpVertexArray();
#endif
#ifdef DUMP_FACEARRAY
  dumpFaceArray();
#endif
}