Пример #1
0
        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)));
 }
Пример #4
0
        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);
        }