private bool CanRemoveEdge(int index) { var edge = this.PolygonEdges[index]; // (Assumes CCW list in polygons) // (Assumes the edge is CCW along polygon A) // In order to be able to remove an edge and (eventually) combine the polygons together two corners where the polygons match be less than 180 degress // CornerA: (P1 - A.prev) x (B.next - P1) { int indexA = edge.PolygonA.IndexOf(edge.EdgePoint1); int indexPrevA = edge.PolygonA.PreviousIndex(indexA); int indexB = edge.PolygonB.IndexOf(edge.EdgePoint1); int indexNextB = edge.PolygonB.NextIndex(indexB); Poly2Tri.Point2D prevA = edge.PolygonA[indexPrevA]; Poly2Tri.Point2D nextB = edge.PolygonB[indexNextB]; Poly2Tri.Point2D line1 = edge.EdgePoint1 - prevA; Poly2Tri.Point2D line2 = nextB - edge.EdgePoint1; double cross = Poly2Tri.Point2D.Cross(line1, line2); if (cross < 0) { return(false); } } // CornerB: (A.next - P2) x (P2 - B.prev) { int indexA = edge.PolygonA.IndexOf(edge.EdgePoint2); int indexNextA = edge.PolygonA.NextIndex(indexA); int indexB = edge.PolygonB.IndexOf(edge.EdgePoint2); int indexPrevB = edge.PolygonB.PreviousIndex(indexB); Poly2Tri.Point2D nextA = edge.PolygonA[indexNextA]; Poly2Tri.Point2D prevB = edge.PolygonB[indexPrevB]; Poly2Tri.Point2D line1 = nextA - edge.EdgePoint2; Poly2Tri.Point2D line2 = edge.EdgePoint2 - prevB; double cross = Poly2Tri.Point2D.Cross(line1, line2); if (cross > 0) { return(false); } } return(true); }
public static Vector2 poly2triToUnity(Poly2Tri.Point2D pt) { return(new Vector2(pt.Xf, pt.Yf)); }
public static ClipperLib.IntPoint poly2triToClipper(Poly2Tri.Point2D pt) { return(new ClipperLib.IntPoint((long)(pt.X * scalar), (long)(pt.Y * scalar))); }
private void CombinePolygonsAlongEdge(int index) { // We are going to combine all the points from polygon B into polygon A var edge = this.PolygonEdges[index]; // Gather a list of all the points from polygon B to be added // This is all the points from polygon B except for the shared edge List <Poly2Tri.Point2D> pointsToAdd = new List <Poly2Tri.Point2D>(); { int edgeStartOnBIndex = edge.PolygonB.IndexOf(edge.EdgePoint1); int edgeStopOnBIndex = edge.PolygonB.IndexOf(edge.EdgePoint2); int indexToAdd = edge.PolygonB.NextIndex(edgeStartOnBIndex); while (indexToAdd != edgeStopOnBIndex) { Poly2Tri.Point2D point = edge.PolygonB[indexToAdd]; pointsToAdd.Add(point); indexToAdd = edge.PolygonB.NextIndex(indexToAdd); } } // Insert the points to add between the edge points on polygon A List <Poly2Tri.Point2D> newPolygonAPoints = edge.PolygonA.ToList(); { int edgeStartOnAIndex = edge.PolygonA.IndexOf(edge.EdgePoint1); int nextIndexA = edge.PolygonA.NextIndex(edgeStartOnAIndex); newPolygonAPoints.InsertRange(nextIndexA, pointsToAdd); } // Create a new polygon A Poly2Tri.Point2DList newPolygonA = new Poly2Tri.Point2DList(newPolygonAPoints); this.Polygons.Add(newPolygonA); // Any furter edges that had PolygonA or PolygonB in it must be updated for (int i = index + 1; i < this.PolygonEdges.Count; ++i) { var furtherEdge = this.PolygonEdges[i]; if (furtherEdge.PolygonA == edge.PolygonA) { furtherEdge.PolygonA = newPolygonA; } else if (furtherEdge.PolygonA == edge.PolygonB) { furtherEdge.PolygonA = newPolygonA; } if (furtherEdge.PolygonB == edge.PolygonA) { furtherEdge.PolygonB = newPolygonA; } else if (furtherEdge.PolygonB == edge.PolygonB) { furtherEdge.PolygonB = newPolygonA; } } // Old PolygonA and PolygonB are removed from the list of polygons this.Polygons.Remove(edge.PolygonA); this.Polygons.Remove(edge.PolygonB); }