/// <summary> /// Creates a new edge from eOrg->Dst to eDst->Org, and returns the corresponding half-edge eNew. /// If eOrg->Lface == eDst->Lface, this splits one loop into two, /// and the newly created loop is eNew->Lface. Otherwise, two disjoint /// loops are merged into one, and the loop eDst->Lface is destroyed. /// /// If (eOrg == eDst), the new face will have only two edges. /// If (eOrg->Lnext == eDst), the old face is reduced to a single edge. /// If (eOrg->Lnext->Lnext == eDst), the old face is reduced to two edges. /// </summary> public MeshUtils.Edge Connect(MeshUtils.Edge eOrg, MeshUtils.Edge eDst) { var eNew = MeshUtils.MakeEdge(eOrg); var eNewSym = eNew._Sym; 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); } // Connect the new edge appropriately MeshUtils.Splice(eNew, eOrg._Lnext); MeshUtils.Splice(eNewSym, eDst); // Set the vertex and face information eNew._Org = eOrg._Dst; eNewSym._Org = eDst._Org; eNew._Lface = eNewSym._Lface = eOrg._Lface; // Make sure the old face points to a valid half-edge eOrg._Lface._anEdge = eNewSym; if (!joiningLoops) { MeshUtils.MakeFace(new MeshUtils.Face(), eNew, eOrg._Lface); } return(eNew); }
/// <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); }