// doCube: triangulate the cube directly, without decomposition
void IsoSurfacePolygonizer::doCube(const StackedCube &cube) {
  m_statistics.m_doCubeCalls++;
  const PolygonizerCubeArray &polys = s_cubetable.get(cube.getIndex());
  for(size_t i = 0; i < polys.size(); i++) {
    int a = -1, b = -1;
    const CompactArray<char> &vertexEdges = polys[i];
    for(size_t j = 0; j < vertexEdges.size(); j++) {
      const CubeEdgeInfo     &edge = cubeEdgeTable[vertexEdges[j]];
      const HashedCubeCorner &c1   = *cube.m_corners[edge.corner1];
      const HashedCubeCorner &c2   = *cube.m_corners[edge.corner2];
      const int c = getVertexId(c1, c2);
      if(j >= 2) {
        putFace3(c, b, a);
      } else {
        a = b;
      }
      b = c;
    }
  }
}
// **** Tetrahedral Polygonization ****
// doTetra: triangulate the tetrahedron
// b, c, d should appear clockwise when viewed from a
void IsoSurfacePolygonizer::doTetra(const HashedCubeCorner &a, const HashedCubeCorner &b, const HashedCubeCorner &c, const HashedCubeCorner &d) {
  m_statistics.m_doTetraCalls++;

  BYTE index = 0;
  if(a.m_positive) index |= 8;
  if(b.m_positive) index |= 4;
  if(c.m_positive) index |= 2;
  if(d.m_positive) index |= 1;
  // index is now 4-bit number representing one of the 16 possible cases

  int ab, ac, ad, bc, bd, cd;
  if(a.m_positive != b.m_positive) ab = getVertexId(a, b);
  if(a.m_positive != c.m_positive) ac = getVertexId(a, c);
  if(a.m_positive != d.m_positive) ad = getVertexId(a, d);
  if(b.m_positive != c.m_positive) bc = getVertexId(b, c);
  if(b.m_positive != d.m_positive) bd = getVertexId(b, d);
  if(c.m_positive != d.m_positive) cd = getVertexId(c, d);
  // 14 productive tetrahedral cases (0000 and 1111 do not yield polygons

  TriangleStrip ts;

  switch (index) {
  case  0:                                         //----
  case 15:                                         //++++
    m_statistics.m_nonProduktiveCalls++;
    return;
  case  1: ts = TriangleStrip(ad,bd,cd   ); break; //---+
  case  2: ts = TriangleStrip(ac,cd,bc   ); break; //--+-
  case  3: ts = TriangleStrip(ad,bd,bc,ac); break; //--++
  case  4: ts = TriangleStrip(ab,bc,bd   ); break; //-+--
  case  5: ts = TriangleStrip(ad,ab,bc,cd); break; //-+-+
  case  6: ts = TriangleStrip(ab,ac,cd,bd); break; //-++-
  case  7: ts = TriangleStrip(ab,ac,ad   ); break; //-+++
  case  8: ts = TriangleStrip(ab,ad,ac   ); break; //+---
  case  9: ts = TriangleStrip(ab,bd,cd,ac); break; //+--+
  case 10: ts = TriangleStrip(ab,ad,cd,bc); break; //+-+-
  case 11: ts = TriangleStrip(ab,bd,bc   ); break; //+-++
  case 12: ts = TriangleStrip(ad,ac,bc,bd); break; //++--
  case 13: ts = TriangleStrip(ac,bc,cd   ); break; //++-+
  case 14: ts = TriangleStrip(ad,cd,bd   ); break; //+++-
  default: throwException(_T("doTetra:Invalid index:%d"), index);
  }
  putTriangleStrip(ts);
}
Esempio n. 3
0
long Network::getDegree(const std::string& vertex_name) const  {
	return getDegree(getVertexId(vertex_name));
}
std::string MultipleNetwork::getLocalVertexName(std::string global_vertex_name, std::string network_name) {
	global_vertex_id global_id = getVertexId(global_vertex_name);
	network_id net = getNetworkId(network_name);
	vertex_id local_id = getLocalVertexId(global_id, net);
	return getNetwork(net)->getVertexName(local_id);
}
bool MultipleNetwork::containsVertex(std::string global_vertex_name, std::string network_name) {
	global_vertex_id global_id = getVertexId(global_vertex_name);
	network_id net = getNetworkId(network_name);
	return containsVertex(global_id,net);
}
void MultipleNetwork::map(std::string global_vertex_name, std::string local_vertex_name, std::string network_name) {
	if (!containsVertex(global_vertex_name)) throw ElementNotFoundException("global vertex name " + global_vertex_name);
	if (!getNetwork(network_name)->containsVertex(local_vertex_name)) throw ElementNotFoundException("local vertex name " + local_vertex_name);
	if (!containsNetwork(network_name)) throw ElementNotFoundException("network " + network_name);
	map(getVertexId(global_vertex_name),getNetwork(network_name)->getVertexId(local_vertex_name),getNetworkId(network_name));
}
Esempio n. 7
0
std::string MultiplexNetwork::getVertexName(const std::string& global_vertex_name, const std::string& network_name) const {
	global_identity global_id = getGlobalIdentity(global_vertex_name);
	network_id net = getNetworkId(network_name);
	vertex_id local_id = getVertexId(global_id, net);
	return getNetwork(net).getVertexName(local_id);
}