/// <summary> /// Exhaustive search to update neighbor pointers /// </summary> public void MarkNeighbor(DelaunayTriangle t) { // Points of this triangle also belonging to t bool a = t.Contains(Points[0]); bool b = t.Contains(Points[1]); bool c = t.Contains(Points[2]); if (b && c) { Neighbors[0] = t; t.MarkNeighbor(Points[1], Points[2], this); } else if (a && c) { Neighbors[1] = t; t.MarkNeighbor(Points[0], Points[2], this); } else if (a && b) { Neighbors[2] = t; t.MarkNeighbor(Points[0], Points[1], this); } else { throw new Exception("Failed to mark neighbor, doesn't share an edge!"); } }
/// <summary> /// Exhaustive search to update neighbor pointers /// </summary> public void MarkNeighbor( DelaunayTriangle t ) { // Points of this triangle also belonging to t bool a = t.Contains(Points[0]); bool b = t.Contains(Points[1]); bool c = t.Contains(Points[2]); if (b&&c) { Neighbors[0]=t; t.MarkNeighbor(Points[1],Points[2],this); } else if (a&&c) { Neighbors[1]=t; t.MarkNeighbor(Points[0],Points[2],this); } else if (a&&b) { Neighbors[2]=t; t.MarkNeighbor(Points[0],Points[1],this); } else throw new Exception( "Failed to mark neighbor, doesn't share an edge!"); }
private static void EdgeEvent(DTSweepContext tcx, TriangulationPoint ep, TriangulationPoint eq, DelaunayTriangle triangle, TriangulationPoint point) { TriangulationPoint p1, p2; if (tcx.IsDebugEnabled) { tcx.DTDebugContext.PrimaryTriangle = triangle; } if (triangle == null) { return; // TODO: Added by Kronnect Games } if (IsEdgeSideOfTriangle(triangle, ep, eq)) { return; } p1 = triangle.PointCCWFrom(point); Orientation o1 = TriangulationUtil.Orient2d(eq, p1, ep); if (o1 == Orientation.Collinear) { if (triangle.Contains(eq) && triangle.Contains(p1)) { triangle.MarkConstrainedEdge(eq, p1); // We are modifying the constraint maybe it would be better to // not change the given constraint and just keep a variable for the new constraint tcx.EdgeEvent.ConstrainedEdge.Q = p1; triangle = triangle.NeighborAcrossFrom(point); EdgeEvent(tcx, ep, p1, triangle, p1); } else { throw new PointOnEdgeException("EdgeEvent - Point on constrained edge not supported yet", ep, eq, p1); } if (tcx.IsDebugEnabled) { Console.WriteLine("EdgeEvent - Point on constrained edge"); } return; } p2 = triangle.PointCWFrom(point); Orientation o2 = TriangulationUtil.Orient2d(eq, p2, ep); if (o2 == Orientation.Collinear) { if (triangle.Contains(eq) && triangle.Contains(p2)) { triangle.MarkConstrainedEdge(eq, p2); // We are modifying the constraint maybe it would be better to // not change the given constraint and just keep a variable for the new constraint tcx.EdgeEvent.ConstrainedEdge.Q = p2; triangle = triangle.NeighborAcrossFrom(point); EdgeEvent(tcx, ep, p2, triangle, p2); } else { throw new PointOnEdgeException("EdgeEvent - Point on constrained edge not supported yet", ep, eq, p2); } if (tcx.IsDebugEnabled) { Console.WriteLine("EdgeEvent - Point on constrained edge"); } return; } if (o1 == o2) { // Need to decide if we are rotating CW or CCW to get to a triangle // that will cross edge if (o1 == Orientation.CW) { triangle = triangle.NeighborCCWFrom(point); } else { triangle = triangle.NeighborCWFrom(point); } EdgeEvent(tcx, ep, eq, triangle, point); } else { // This triangle crosses constraint so lets flippin start! FlipEdgeEvent(tcx, ep, eq, triangle, point); } }
private static void EdgeEvent(DTSweepContext tcx, TriangulationPoint ep, TriangulationPoint eq, DelaunayTriangle triangle, TriangulationPoint point) { TriangulationPoint p1, p2; if (tcx.IsDebugEnabled) { tcx.DTDebugContext.PrimaryTriangle = triangle; } if (IsEdgeSideOfTriangle(triangle, ep, eq)) { return; } p1 = triangle.PointCCWFrom(point); Orientation o1 = TriangulationUtil.Orient2d(eq, p1, ep); if (o1 == Orientation.Collinear) { if (triangle.Contains(eq) && triangle.Contains(p1)) { triangle.MarkConstrainedEdge(eq, p1); // We are modifying the constraint maybe it would be better to // not change the given constraint and just keep a variable for the new constraint tcx.EdgeEvent.ConstrainedEdge.Q = p1; triangle = triangle.NeighborAcrossFrom(point); EdgeEvent(tcx, ep, p1, triangle, p1); } else { throw new PointOnEdgeException("EdgeEvent - Point on constrained edge not supported yet", ep, eq, p1); } if (tcx.IsDebugEnabled) { Console.WriteLine("EdgeEvent - Point on constrained edge"); } return; } p2 = triangle.PointCWFrom(point); Orientation o2 = TriangulationUtil.Orient2d(eq, p2, ep); if (o2 == Orientation.Collinear) { if (triangle.Contains(eq) && triangle.Contains(p2)) { triangle.MarkConstrainedEdge(eq, p2); // We are modifying the constraint maybe it would be better to // not change the given constraint and just keep a variable for the new constraint tcx.EdgeEvent.ConstrainedEdge.Q = p2; triangle = triangle.NeighborAcrossFrom(point); EdgeEvent(tcx, ep, p2, triangle, p2); } else { throw new PointOnEdgeException("EdgeEvent - Point on constrained edge not supported yet", ep, eq, p2); } if (tcx.IsDebugEnabled) { Console.WriteLine("EdgeEvent - Point on constrained edge"); } return; } if (o1 == o2) { // Need to decide if we are rotating CW or CCW to get to a triangle // that will cross edge if (o1 == Orientation.CW) { triangle = triangle.NeighborCCWFrom(point); } else { triangle = triangle.NeighborCWFrom(point); } EdgeEvent(tcx, ep, eq, triangle, point); } else { // This triangle crosses constraint so lets flippin start! FlipEdgeEvent(tcx, ep, eq, triangle, point); } }
public static bool Test(DelaunayTriangle triangle, Vec2 p) { return triangle.Contains(new TriangulationPoint(p.X, p.Y)); }