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]);
        }