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