private PathSegment TransformSegment(Microsoft.Msagl.Core.Geometry.Curves.ICurve curve)
 {
     if (curve is Microsoft.Msagl.Core.Geometry.Curves.LineSegment lineSegment)
     {
         return new LineSegment {
                    Point = Convert(lineSegment.End)
         }
     }
     ;
     if (curve is Microsoft.Msagl.Core.Geometry.Curves.CubicBezierSegment bezierSegment)
     {
         return new BezierSegment
                {
                    Point1 = Convert(bezierSegment.B(1)),
                    Point2 = Convert(bezierSegment.B(2)),
                    Point3 = Convert(bezierSegment.End)
                }
     }
     ;
     if (curve is Microsoft.Msagl.Core.Geometry.Curves.Ellipse ellipse)
     {
         return(ApproximateEllipticalArcWithBezierCurve_ThisMethodNeedsTesting(ellipse));
     }
     throw new NotImplementedException(string.Format("Cannot transform {0} of type {1}", curve, curve.GetType().FullName));
 }
 private IEnumerable <Microsoft.Msagl.Core.Geometry.Curves.ICurve> Flatten(Microsoft.Msagl.Core.Geometry.Curves.ICurve curve)
 {
     if (curve is Microsoft.Msagl.Core.Geometry.Curves.Curve compositeCurve)
     {
         return(compositeCurve.Segments.SelectMany(c => Flatten(c)));
     }
     return(Enumerable.Repeat(curve, 1));
 }
        public PathFigure Convert(Microsoft.Msagl.Core.Geometry.Curves.ICurve curve)
        {
            var segments = new PathSegments();

            segments.AddRange(Flatten(curve).Select(s => TransformSegment(s)));
            return(new PathFigure
            {
                StartPoint = Convert(curve.Start),
                Segments = segments,
                IsClosed = false,
                IsFilled = false
            });
        }