/// <summary> /// Creates one edge, two vertices and a loop (face). /// The loop consists of the two new half-edges. /// </summary> public MeshUtils.Edge MakeEdge() { var e = MeshUtils.MakeEdge(_eHead); MeshUtils.MakeVertex(new MeshUtils.Vertex(), e, _vHead); MeshUtils.MakeVertex(new MeshUtils.Vertex(), e._Sym, _vHead); MeshUtils.MakeFace(new MeshUtils.Face(), e, _fHead); return(e); }
/// <summary> /// Creates a new edge such that eNew == eOrg.Lnext and eNew.Dst is a newly created vertex. /// eOrg and eNew will have the same left face. /// </summary> public MeshUtils.Edge AddEdgeVertex(MeshUtils.Edge eOrg) { var eNew = MeshUtils.MakeEdge(eOrg); var eNewSym = eNew._Sym; // Connect the new edge appropriately MeshUtils.Splice(eNew, eOrg._Lnext); // Set vertex and face information eNew._Org = eOrg._Dst; MeshUtils.MakeVertex(new MeshUtils.Vertex(), eNewSym, eNew._Org); eNew._Lface = eNewSym._Lface = eOrg._Lface; return(eNew); }
/// <summary> /// Splice is the basic operation for changing the /// mesh connectivity and topology. It changes the mesh so that /// eOrg->Onext = OLD( eDst->Onext ) /// eDst->Onext = OLD( eOrg->Onext ) /// where OLD(...) means the value before the meshSplice operation. /// /// This can have two effects on the vertex structure: /// - if eOrg->Org != eDst->Org, the two vertices are merged together /// - if eOrg->Org == eDst->Org, the origin is split into two vertices /// In both cases, eDst->Org is changed and eOrg->Org is untouched. /// /// Similarly (and independently) for the face structure, /// - if eOrg->Lface == eDst->Lface, one loop is split into two /// - if eOrg->Lface != eDst->Lface, two distinct loops are joined into one /// In both cases, eDst->Lface is changed and eOrg->Lface is unaffected. /// /// Some special cases: /// If eDst == eOrg, the operation has no effect. /// If eDst == eOrg->Lnext, the new face will have a single edge. /// If eDst == eOrg->Lprev, the old face will have a single edge. /// If eDst == eOrg->Onext, the new vertex will have a single edge. /// If eDst == eOrg->Oprev, the old vertex will have a single edge. /// </summary> public void Splice(MeshUtils.Edge eOrg, MeshUtils.Edge eDst) { if (eOrg == eDst) { return; } bool joiningVertices = false; if (eDst._Org != eOrg._Org) { // We are merging two disjoint vertices -- destroy eDst->Org joiningVertices = true; MeshUtils.KillVertex(eDst._Org, eOrg._Org); } bool joiningLoops = false; if (eDst._Lface != eOrg._Lface) { // We are connecting two disjoint loops -- destroy eDst->Lface joiningLoops = true; MeshUtils.KillFace(eDst._Lface, eOrg._Lface); } // Change the edge structure MeshUtils.Splice(eDst, eOrg); if (!joiningVertices) { // We split one vertex into two -- the new vertex is eDst->Org. // Make sure the old vertex points to a valid half-edge. MeshUtils.MakeVertex(new MeshUtils.Vertex(), eDst, eOrg._Org); eOrg._Org._anEdge = eOrg; } if (!joiningLoops) { // We split one loop into two -- the new loop is eDst->Lface. // Make sure the old face points to a valid half-edge. MeshUtils.MakeFace(new MeshUtils.Face(), eDst, eOrg._Lface); eOrg._Lface._anEdge = eOrg; } }