public static Polyline CollapseToScaledPolyline(this PolyCurve curve, double relativeAngleTolerance = 0.04, double toleranceScaleFactor = 0.001, int maxDivisionsPerSegment = 200, double scale = 0) { if (relativeAngleTolerance <= 0) { return(null); } if (toleranceScaleFactor < 0) { toleranceScaleFactor = 0; } else if (toleranceScaleFactor > 0.01) { Reflection.Compute.RecordWarning("High values for toleranceGrowth can be unstable and are not recommended"); } if (scale <= 0) { BoundingBox box = curve.IBounds(); Point min = box.Min; Point max = box.Max; double totalWidth = max.X - min.X; double totalHeight = max.Y - min.Y; scale = Math.Max(totalHeight, totalWidth) / 2; } double scaledTolerance = scale * toleranceScaleFactor; relativeAngleTolerance -= scaledTolerance; List <Polyline> list = new List <Polyline>(); foreach (ICurve c in curve.Curves) { if (c is PolyCurve) { list.Add(CollapseToScaledPolyline(c as PolyCurve, relativeAngleTolerance, toleranceScaleFactor, maxDivisionsPerSegment, scale)); } list.Add(Divide(c as dynamic, scaledTolerance, relativeAngleTolerance, maxDivisionsPerSegment)); } return((Geometry.Compute.Join(list))[0]); }