private static void SetPrevAndNextToExistingHalfEdge(BoundaryEdge bEdge, int existingHeHandle, IList <BoundaryEdge> boundaryEdges, ICollection <HalfEdge> halfEdgesToUpdate) { var existingHe = _geometry.GetHalfEdgeByHandle(existingHeHandle); var existingHeNext = _geometry.GetHalfEdgeByHandle(existingHe.NextHalfEdge); var existingHePrev = _geometry.GetHalfEdgeByHandle(existingHe.PrevHalfEdge); existingHe.NextHalfEdge = bEdge.HalfEdge.NextHalfEdge; existingHe.PrevHalfEdge = bEdge.HalfEdge.PrevHalfEdge; existingHe.IncidentFace = bEdge.HalfEdge.IncidentFace; for (var j = 0; j < boundaryEdges.Count; j++) { var count = 0; var be = boundaryEdges[j]; if (be.TwinHalfEdge.Handle == bEdge.TwinHalfEdge.PrevHalfEdge) { var twinHalfEdge = be.TwinHalfEdge; twinHalfEdge.NextHalfEdge = existingHeNext.Handle; var halfEdge = be.HalfEdge; halfEdge.PrevHalfEdge = existingHeHandle; be.TwinHalfEdge = twinHalfEdge; be.HalfEdge = halfEdge; existingHeNext.PrevHalfEdge = twinHalfEdge.Handle; halfEdgesToUpdate.Add(existingHeNext); boundaryEdges[j] = be; count++; } if (be.TwinHalfEdge.Handle == bEdge.TwinHalfEdge.NextHalfEdge) { var twinHalfEdge = be.TwinHalfEdge; twinHalfEdge.PrevHalfEdge = existingHePrev.Handle; var halfEdge = be.HalfEdge; halfEdge.NextHalfEdge = existingHeHandle; be.TwinHalfEdge = twinHalfEdge; be.HalfEdge = halfEdge; existingHePrev.NextHalfEdge = twinHalfEdge.Handle; halfEdgesToUpdate.Add(existingHePrev); boundaryEdges[j] = be; count++; } if (count == 2) { break; } } }
private static List <BoundaryEdge> BoundaryEdges(IList <KeyValuePair <Vertex, bool> > outlineVerts, PolyBoundary polyBoundary) { var faceHandle = new int(); var boundaryEdges = new List <BoundaryEdge>(); var halfEdgeHandle = 0; if (_geometry.DictHalfEdges.Count != 0) { halfEdgeHandle = _geometry.DictHalfEdges.Count; } for (var j = 0; j < outlineVerts.Count; j++) { var currentVert = outlineVerts[j]; halfEdgeHandle++; if (!currentVert.Value) { //Only necessary for new vertices. var vert = currentVert.Key; vert.IncidentHalfEdge = halfEdgeHandle; _geometry.DictVertices.Add(vert.Handle, vert); } var halfEdge = new HalfEdge(halfEdgeHandle, currentVert.Key.Handle); halfEdgeHandle++; var twinHalfEdge = new HalfEdge(halfEdgeHandle, outlineVerts[(j + 1) % outlineVerts.Count].Key.Handle, halfEdge.Handle, 0, 0, 1); //The unbounded face is always added at first and therefor has 1 as handle. halfEdge.TwinHalfEdge = twinHalfEdge.Handle; //Assumption: outlines are processed from outer to inner, therefore faceHandle will never has its default value if "else" is hit. if (polyBoundary.IsOuter) { if (faceHandle == default(int)) { Face face; faceHandle = AddFace(halfEdge.Handle, out face); _geometry.DictFaces.Add(face.Handle, face); } } else { if (j == 0) { var lastFace = _geometry.DictFaces[_geometry.DictFaces.Keys.Max()]; lastFace.InnerHalfEdges.Add(halfEdge.Handle); } faceHandle = _geometry.DictFaces.Last().Value.Handle; } halfEdge.IncidentFace = faceHandle; if (!outlineVerts[j].Value) { var unboundFace = _geometry.DictFaces[1]; if (j == 0) { unboundFace.InnerHalfEdges.Add(twinHalfEdge.Handle); _geometry.DictFaces[1] = unboundFace; } } var boundaryEdge = new BoundaryEdge { IsOriginOldVert = currentVert.Value, HalfEdge = halfEdge, TwinHalfEdge = twinHalfEdge }; boundaryEdges.Add(boundaryEdge); } return(boundaryEdges); }