Ejemplo n.º 1
0
        // Slice From Point
        static public Slice2D SliceFromPoint(Polygon2D polygon, Vector2D point, float rotation)
        {
            Slice2D result = Slice2D.Create(null, point, rotation);

            // Normalize into clockwise
            polygon.Normalize();

            Vector2D sliceA = new Vector2D(point);
            Vector2D sliceB = new Vector2D(point);

            sliceA.Push(rotation, 1e+10f / 2);
            sliceB.Push(rotation, -1e+10f / 2);

            if (polygon.PointInPoly(point) == false)
            {
                return(result);
            }

            // Getting the list of intersections
            List <Vector2D> intersectionsA = polygon.GetListLineIntersectPoly(new Pair2D(point, sliceA));
            List <Vector2D> intersectionsB = polygon.GetListLineIntersectPoly(new Pair2D(point, sliceB));

            // Sorting intersections from one point
            if (intersectionsA.Count > 0 && intersectionsB.Count > 0)
            {
                sliceA = Vector2DList.GetListSortedToPoint(intersectionsA, point) [0];
                sliceB = Vector2DList.GetListSortedToPoint(intersectionsB, point) [0];
            }
            else
            {
                return(result);
            }

            List <Pair2D> collisionList = new List <Pair2D>();

            collisionList.Add(new Pair2D(sliceA, sliceB));

            result.AddPolygon(polygon);

            foreach (Pair2D id in collisionList)
            {
                result.AddCollision(id.A);
                result.AddCollision(id.B);

                // Sclice line points generated from intersections list
                Vector2D vec0 = new Vector2D(id.A);
                Vector2D vec1 = new Vector2D(id.B);

                double rot = Vector2D.Atan2(vec0, vec1);

                // Slightly pushing slice line so it intersect in all cases
                vec0.Push(rot, LinearSlicer.precision);
                vec1.Push(rot, -LinearSlicer.precision);

                // For each in polygons list attempt convex split
                List <Polygon2D> temp = new List <Polygon2D>(result.GetPolygons());               // necessary?
                foreach (Polygon2D poly in temp)
                {
                    // NO, that's the problem
                    Slice2D resultList = LinearSlicer.Slice(poly, new Pair2D(vec0, vec1));

                    if (resultList.GetPolygons().Count > 0)
                    {
                        if (resultList.slices.Count > 0)
                        {
                            foreach (List <Vector2D> i in resultList.slices)
                            {
                                result.AddSlice(i);
                            }
                        }

                        foreach (Polygon2D i in resultList.GetPolygons())
                        {
                            result.AddPolygon(i);
                        }

                        // If it's possible to perform splice, remove parent polygon from result list
                        result.RemovePolygon(poly);
                    }
                }
            }
            result.RemovePolygon(polygon);
            return(result);
        }
Ejemplo n.º 2
0
 static public Slice2D LinearSlice(Polygon2D polygon, Pair2D slice)
 {
     return(LinearSlicer.Slice(polygon, slice));
 }