// 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); }
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)); }
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); }