private static void HandleStartVertex(Face face, Vertex vert, IEnumerable <HalfEdge> faceHalfEdges) { foreach (var halfEdge in faceHalfEdges) { var he = halfEdge; if (he.OriginVertex != vert.Handle) { continue; } var origin = _geometry.GetVertexByHandle(he.OriginVertex); int targetH; targetH = _geometry.GetHalfEdgeByHandle(he.NextHalfEdge).OriginVertex; var target = _geometry.GetVertexByHandle(targetH); var ei = new TriStatusEdge(_geometry, face, origin, target, vert); ei.HalfEdgeHandle = he.Handle; ei.HelperVertexHandle = vert.Handle; ei.IsMergeVertex = false; _triSweepLineStatus.InsertNode(ei.IntersectionPointX, ei); break; } }
private static void HandleRegularVertex(Face face, Vertex vert, IList <HalfEdge> faceHalfEdges, ICollection <Face> newFaces) { if (IsPolygonRightOfVert(_geometry, face, faceHalfEdges, vert)) { foreach (var he in faceHalfEdges) { if (he.OriginVertex != vert.Handle) { continue; } var eMinOne = _triSweepLineStatus.FindStatusEdgeWithHandle(he.PrevHalfEdge); if (eMinOne.IsMergeVertex) { _geometry.InsertDiagonal(vert.Handle, eMinOne.HelperVertexHandle); newFaces.Add(_geometry.DictFaces[_geometry.DictFaces.Keys.Max()]); } _triSweepLineStatus.DeleteNode(eMinOne.IntersectionPointX); var halfEdge = _geometry.GetHalfEdgeByHandle(vert.IncidentHalfEdge); var origin = _geometry.GetVertexByHandle(halfEdge.OriginVertex); int targetH; targetH = _geometry.GetHalfEdgeByHandle(he.NextHalfEdge).OriginVertex; var target = _geometry.GetVertexByHandle(targetH); var ei = new TriStatusEdge(_geometry, face, origin, target, vert); ei.HalfEdgeHandle = he.Handle; ei.HelperVertexHandle = vert.Handle; ei.IsMergeVertex = false; _triSweepLineStatus.InsertNode(ei.IntersectionPointX, ei); break; } } else { _triSweepLineStatus.BalanceTree(); var redXPos = _geometry.Get2DVertPos(face, vert.Handle).x; var ej = _triSweepLineStatus.FindLargestSmallerThanInBalanced(redXPos); if (ej.IsMergeVertex) { _geometry.InsertDiagonal(vert.Handle, ej.HelperVertexHandle); newFaces.Add(_geometry.DictFaces[_geometry.DictFaces.Keys.Max()]); } _triSweepLineStatus.FindNode(ej.IntersectionPointX).HelperVertexHandle = vert.Handle; _triSweepLineStatus.FindNode(ej.IntersectionPointX).IsMergeVertex = false; } }
private static void HandleSplitVertex(Face face, Vertex vert, IEnumerable <HalfEdge> faceHalfEdges, ICollection <Face> newFaces) { _triSweepLineStatus.BalanceTree(); var redXPos = _geometry.Get2DVertPos(face, vert.Handle).x; var ej = _triSweepLineStatus.FindLargestSmallerThanInBalanced(redXPos); _geometry.InsertDiagonal(vert.Handle, ej.HelperVertexHandle); newFaces.Add(_geometry.DictFaces[_geometry.DictFaces.Keys.Max()]); _triSweepLineStatus.FindNode(ej.IntersectionPointX).HelperVertexHandle = vert.Handle; _triSweepLineStatus.FindNode(ej.IntersectionPointX).IsMergeVertex = false; var he = new HalfEdge(); foreach (var halfEdge in faceHalfEdges) { if (halfEdge.OriginVertex != vert.Handle) { continue; } he = halfEdge; break; } var origin = _geometry.GetVertexByHandle(he.OriginVertex); var targetH = _geometry.GetHalfEdgeByHandle(he.NextHalfEdge).OriginVertex; var target = _geometry.GetVertexByHandle(targetH); var ei = new TriStatusEdge(_geometry, face, origin, target, vert); ei.HalfEdgeHandle = he.Handle; ei.HelperVertexHandle = vert.Handle; ei.IsMergeVertex = false; _triSweepLineStatus.InsertNode(ei.IntersectionPointX, ei); }