// 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); }
static public Slice2D LinearSlice(Polygon2D polygon, Pair2D slice) { return(LinearSlicer.Slice(polygon, slice)); }