/// <summary> /// Constructs the Polygon intersections between this Polygon and the supplied Polygon. /// </summary> /// <param name="polygon">The intersecting Polygon.</param> /// <returns> /// Returns a list of Polygons representing the intersection of this Polygon with the supplied Polygon. /// Returns null if the two Polygons do not intersect. /// </returns> public IList <Polygon> Intersection(Polygon polygon) { var thisPath = this.ToClipperPath(); var polyPath = polygon.ToClipperPath(); Clipper clipper = new Clipper(); clipper.AddPath(thisPath, PolyType.ptSubject, true); clipper.AddPath(polyPath, PolyType.ptClip, true); var solution = new List <List <IntPoint> >(); clipper.Execute(ClipType.ctIntersection, solution); if (solution.Count == 0) { return(null); } var polygons = new List <Polygon>(); foreach (List <IntPoint> path in solution) { polygons.Add(PolygonExtensions.ToPolygon(path)); } return(polygons); }
/// <summary> /// Constructs the geometric difference between this Polygon and the supplied Polygon. /// </summary> /// <param name="polygon">The intersecting Polygon.</param> /// <param name="tolerance">An optional tolerance value.</param> /// <returns> /// Returns a list of Polygons representing the subtraction of the supplied Polygon from this Polygon. /// Returns null if the area of this Polygon is entirely subtracted. /// Returns a list containing a representation of the perimeter of this Polygon if the two Polygons do not intersect. /// </returns> public IList <Polygon> Difference(Polygon polygon, double tolerance = Vector3.EPSILON) { var thisPath = this.ToClipperPath(tolerance); var polyPath = polygon.ToClipperPath(tolerance); Clipper clipper = new Clipper(); clipper.AddPath(thisPath, PolyType.ptSubject, true); clipper.AddPath(polyPath, PolyType.ptClip, true); var solution = new List <List <IntPoint> >(); clipper.Execute(ClipType.ctDifference, solution, PolyFillType.pftNonZero); if (solution.Count == 0) { return(null); } var polygons = new List <Polygon>(); foreach (List <IntPoint> path in solution) { polygons.Add(PolygonExtensions.ToPolygon(path, tolerance)); } return(polygons); }