private static void ComputeNextCWEdges(Node node) { DirectedEdgeStar deStar = node.OutEdges; PolygonizeDirectedEdge startDE = null; PolygonizeDirectedEdge prevDE = null; // the edges are stored in CCW order around the star for (IEnumerator i = deStar.Edges.GetEnumerator(); i.MoveNext();) { PolygonizeDirectedEdge outDE = (PolygonizeDirectedEdge)i.Current; if (outDE.Marked) { continue; } if (startDE == null) { startDE = outDE; } if (prevDE != null) { PolygonizeDirectedEdge sym = (PolygonizeDirectedEdge)prevDE.Sym; sym.Next = outDE; } prevDE = outDE; } if (prevDE != null) { PolygonizeDirectedEdge sym = (PolygonizeDirectedEdge)prevDE.Sym; sym.Next = startDE; } }
/// <summary> /// /// </summary> /// <param name="node"></param> private static void ComputeNextCWEdges(Node node) { DirectedEdgeStar deStar = node.OutEdges; PolygonizeDirectedEdge startDE = null; PolygonizeDirectedEdge prevDE = null; // the edges are stored in CCW order around the star foreach (PolygonizeDirectedEdge outDE in deStar.Edges) { if (outDE.IsMarked) { continue; } if (startDE == null) { startDE = outDE; } if (prevDE != null) { PolygonizeDirectedEdge sym = (PolygonizeDirectedEdge)prevDE.Sym; sym.Next = outDE; } prevDE = outDE; } if (prevDE != null) { PolygonizeDirectedEdge sym = (PolygonizeDirectedEdge)prevDE.Sym; sym.Next = startDE; } }
/// <summary> /// Computes the next edge pointers going CCW around the given node, for the /// given edgering label. /// This algorithm has the effect of converting maximal edgerings into minimal edgerings /// </summary> /// <param name="node"></param> /// <param name="label"></param> private static void ComputeNextCCWEdges(Node node, long label) { DirectedEdgeStar deStar = node.OutEdges; //PolyDirectedEdge lastInDE = null; PolygonizeDirectedEdge firstOutDE = null; PolygonizeDirectedEdge prevInDE = null; // the edges are stored in CCW order around the star IList edges = deStar.Edges; //for (IEnumerator i = deStar.Edges.GetEnumerator(); i.MoveNext(); ) { for (int i = edges.Count - 1; i >= 0; i--) { PolygonizeDirectedEdge de = (PolygonizeDirectedEdge)edges[i]; PolygonizeDirectedEdge sym = (PolygonizeDirectedEdge)de.Sym; PolygonizeDirectedEdge outDE = null; if (de.Label == label) { outDE = de; } PolygonizeDirectedEdge inDE = null; if (sym.Label == label) { inDE = sym; } if (outDE == null && inDE == null) { continue; // this edge is not in edgering } if (inDE != null) { prevInDE = inDE; } if (outDE != null) { if (prevInDE != null) { prevInDE.Next = outDE; prevInDE = null; } if (firstOutDE == null) { firstOutDE = outDE; } } } if (prevInDE != null) { Assert.IsTrue(firstOutDE != null); prevInDE.Next = firstOutDE; } }
/// <summary> /// /// </summary> private void FindRightmostEdgeAtNode() { Node node = minDe.Node; DirectedEdgeStar star = (DirectedEdgeStar)node.Edges; minDe = star.GetRightmostEdge(); // the DirectedEdge returned by the previous call is not // necessarily in the forward direction. Use the sym edge if it isn't. if (!minDe.IsForward) { minDe = minDe.Sym; minIndex = minDe.Edge.Coordinates.Length - 1; } }