/** * Searches the edge of the common tangent face * @param target vertex * @param eye point * @param scan direction * @return edge of the common tangent face */ int ConvexHull::searchEdgeOfCTFace(int iv0, int eye, ScanDir dir) { int e = kve[iv0]; bool or2 = false; if (dir == ScanDir::CW) { or2 = isFront(leftFace(iv0, e), eye); } else { or2 = isFront(rightFace(iv0, e), eye); } while (1) { bool or1 = false; if (dir == ScanDir::CW) { or1 = isFront(rightFace(iv0, e), eye); } else { or1 = isFront(leftFace(iv0, e), eye); } // if the edge between 2 adjacent faces is the ridge line for the eye point, // that is the edge of the common tangent face if (!or1 && or2) { break; } if (dir == ScanDir::CW) { e = nextCWEdge(iv0, e); } else { e = nextCCWEdge(iv0, e); } or2 = or1; } return e; }
forall_nodes(v, primalGraph) { edge ePrimal = v->firstAdj()->theEdge(); edge eDual = m_dualEdge[ePrimal]; face fDual = rightFace(eDual->adjSource()); if(ePrimal->source()==v) fDual = leftFace(eDual->adjSource()); m_dualFace[v] = fDual; m_primalNode[fDual] = v; }
/** * Searches and deletes non convex hull primitives * @param vertex of the common tangent edge * @param common tangent edge * @param scan direction */ void ConvexHull::deleteNonHullPrims(int iv0, int cte0, ScanDir dir) { int e = cte0; do { e = (dir == ScanDir::CW ? nextCWEdge(iv0, e) : nextCCWEdge(iv0, e)); // deletes all primitives if (e == cte0) { deleteAllPrimitives(iv0); break; } } while (kep[e] != PrimProperty::BOUNDARY); // deletes interior primitives if (kep[e] == PrimProperty::BOUNDARY) { deleteIntPrimitives(dir == ScanDir::CW ? leftFace(iv0, e) : rightFace(iv0, e)); } }
/** * Searches vertices on the silhouette of the convex hull * @param number of vertices * @param vertices * @return left most vertex on the silhouette of the convex hull */ int ConvexHull::searchSilhouette(int nv, int* kv0) { int iv0 = 0; for (int i = 0; i < nv; i++) { iv0 = kv0[i]; int iv = iv0; bool found = false; do { int e0 = kve[iv]; int e = e0; bool or2 = isFront(rightFace(iv, e)); found = false; do { bool or1 = isFront(leftFace(iv, e)); // if the silhouette edge is found, entries vertex to cyclic list if (!or1 && or2) { int nxv = otherVertex(iv, e); kcnxv[iv] = nxv; kccnxv[nxv] = iv; iv = nxv; found = true; break; } e = nextCCWEdge(iv, e); or2 = or1; } while (e != e0); if (!found) { break; } } while (iv != iv0); if (found) { break; } // if silhouette edge is not found, the vertex is not on the silhouette edge // then, searches next vertex } return iv0; }