public override void AddBezier(IPoint2F p1, IPoint2F p2, IPoint2F p3, IPoint2F p4) { Path.AddBezier(Pf(p1), Pf(p2), Pf(p3), Pf(p4)); }
public SvgQuadraticCurveSegment(IPoint2F start, IPoint2F controlPoint, IPoint2F end) : base(start, end) { ControlPoint = controlPoint; }
public override void AddBezier(IPoint2F p1, IPoint2F p2, IPoint2F p3, IPoint2F p4) { if (TryAddConnectingPoint(p1.X, p1.Y, PathPointType.Bezier3)) { if (_points.Count > 1) { //System.Diagnostics.Debug.WriteLine("path.Close();"); Path.Close(); } //System.Diagnostics.Debug.WriteLine("path.MoveTo(" + R4(p1.X) + "f, " + R4(p1.Y) + "f);"); Path.MoveTo(p1.X, p1.Y); } //System.Diagnostics.Debug.WriteLine("path.CubicTo(" + p2.X + "f," + p2.Y + "f," + p3.X + "f," + //p3.Y + "f, " + p4.X + "f, " + p4.Y + "f);"); Path.CubicTo(p2.X, p2.Y, p3.X, p3.Y, p4.X, p4.Y); AddPoint(p2, PathPointType.Bezier3); AddPoint(p3, PathPointType.Bezier3); AddPoint(p4, PathPointType.Bezier3); }
public SvgCubicCurveSegment(IPoint2F start, IPoint2F firstControlPoint, IPoint2F secondControlPoint, IPoint2F end) : base(start, end) { FirstControlPoint = firstControlPoint; SecondControlPoint = secondControlPoint; }
//private static //IEnumerable<SvgPathSegment> // void CreatePathSegments(Char command, // SvgPathSegmentList segments, // CoordinateParserState state, // ReadOnlySpan<Char> chars) //{ // var isRelative = Char.IsLower(command); // // http://www.w3.org/TR/SVG11/paths.html#PathDataGeneralInformation // switch (command) // { // case 'M': // moveto // case 'm': // relative moveto // { // if (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)) // { // var mov = new SvgMoveToSegment( // ToAbsolute(coords0, coords1, segments, isRelative)); // segments.Add(mov); // //yield return mov; // } // while (CoordinateParser.TryGetFloat(out coords0, ref chars, ref state) // && CoordinateParser.TryGetFloat(out coords1, ref chars, ref state)) // { // var line = new SvgLineSegment(segments.Last.End, // ToAbsolute(coords0, coords1, segments, isRelative)); // segments.Add(line); // //yield return line; // } // } // break; // case 'A': // elliptical arc // case 'a': // relative elliptical arc // { // while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state) // && CoordinateParser.TryGetBool(out var size, ref chars, ref state) // && CoordinateParser.TryGetBool(out var sweep, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords4, ref chars, ref state)) // { // // A|a rx ry x-axis-rotation large-arc-flag sweep-flag x y // var arc = new SvgArcSegment( // segments.Last.End, // coords0, // coords1, // coords2, // size ? SvgArcSize.Large : SvgArcSize.Small, // sweep ? SvgArcSweep.Positive : SvgArcSweep.Negative, // ToAbsolute(coords3, coords4, segments, isRelative)); // segments.Add(arc); // //yield return arc; // } // } // break; // case 'L': // lineto // case 'l': // relative lineto // { // while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)) // { // var line = new SvgLineSegment( // segments.Last.End, // ToAbsolute(coords0, coords1, segments, isRelative)); // segments.Add(line); // //yield return line; // } // } // break; // case 'H': // horizontal lineto // case 'h': // relative horizontal lineto // { // while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)) // { // var line = new SvgLineSegment( // segments.Last.End, // ToAbsolute(coords0, segments.Last.End.Y, segments, isRelative, false)); // segments.Add(line); // //yield return line; // } // } // break; // case 'V': // vertical lineto // case 'v': // relative vertical lineto // { // while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state)) // { // var line = new SvgLineSegment( // segments.Last.End, // ToAbsolute(segments.Last.End.X, coords0, segments, false, isRelative)); // segments.Add(line); // //yield return line; // } // } // break; // case 'Q': // quadratic bézier curveto // case 'q': // relative quadratic bézier curveto // { // while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state)) // { // var quad = new SvgQuadraticCurveSegment( // segments.Last.End, // ToAbsolute(coords0, coords1, segments, isRelative), // ToAbsolute(coords2, coords3, segments, isRelative)); // segments.Add(quad); // //yield return quad; // } // } // break; // case 'T': // shorthand/smooth quadratic bézier curveto // case 't': // relative shorthand/smooth quadratic bézier curveto // { // while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state)) // { // var lastQuadCurve = segments.Last as SvgQuadraticCurveSegment; // var controlPoint = lastQuadCurve != null // ? Reflect(lastQuadCurve.ControlPoint, segments.Last.End) // : segments.Last.End; // var quad = new SvgQuadraticCurveSegment( // segments.Last.End, // controlPoint, // ToAbsolute(coords0, coords1, segments, isRelative)); // segments.Add(quad); // //yield return quad; // } // } // break; // case 'C': // curveto // case 'c': // relative curveto // { // while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords4, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords5, ref chars, ref state)) // { // var cube = new SvgCubicCurveSegment( // segments.Last.End, // ToAbsolute(coords0, coords1, segments, isRelative), // ToAbsolute(coords2, coords3, segments, isRelative), // ToAbsolute(coords4, coords5, segments, isRelative)); // segments.Add(cube); // //yield return cube; // } // } // break; // case 'S': // shorthand/smooth curveto // case 's': // relative shorthand/smooth curveto // { // while (CoordinateParser.TryGetFloat(out var coords0, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords1, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords2, ref chars, ref state) // && CoordinateParser.TryGetFloat(out var coords3, ref chars, ref state)) // { // var lastCubicCurve = segments.Last as SvgCubicCurveSegment; // var controlPoint = lastCubicCurve != null // ? Reflect(lastCubicCurve.SecondControlPoint, segments.Last.End) // : segments.Last.End; // var cube = new SvgCubicCurveSegment( // segments.Last.End, // controlPoint, // ToAbsolute(coords0, coords1, segments, isRelative), // ToAbsolute(coords2, coords3, segments, isRelative)); // segments.Add(cube); // //yield return cube; // } // } // break; // case 'Z': // closepath // case 'z': // relative closepath // { // var bye = new SvgClosePathSegment(); // segments.Add(bye); // //yield return bye; // } // break; // } //} private static IPoint2F Reflect(IPoint2F point, IPoint2F mirror) { var dx = Math.Abs(mirror.X - point.X); var dy = Math.Abs(mirror.Y - point.Y); var x = mirror.X + (mirror.X >= point.X ? dx : -dx); var y = mirror.Y + (mirror.Y >= point.Y ? dy : -dy); return(new ValuePoint2F(x, y)); }
public SvgArcSegment(IPoint2F start, Single radiusX, Single radiusY, Single angle, SvgArcSize size, SvgArcSweep sweep, IPoint2F end) : base(start, end) { RadiusX = Math.Abs(radiusX); RadiusY = Math.Abs(radiusY); Angle = angle; Sweep = sweep; Size = size; }
public abstract void AddBezier(IPoint2F p1, IPoint2F p2, IPoint2F p3, IPoint2F p4);
private void AddPoint(IPoint2F p, PathPointType pointType) { _points.Add(p); _pointTypes.Add(pointType); }
public static String ToSvgString(this IPoint2F p) { return(p.X.ToSvgString() + " " + p.Y.ToSvgString()); }
public SvgMoveToSegment(IPoint2F moveTo) : base(moveTo, moveTo) { }
public SvgLineSegment(IPoint2F start, IPoint2F end) : base(start, end) { }
public Boolean Equals(IPoint2F other) { return(Equals(other.X, X) && Equals(other.Y, Y)); }
private static PointF Pf(IPoint2F pf) => new(pf.X, pf.Y);
protected SvgPathSegment(IPoint2F start, IPoint2F end) { Start = start; End = end; }