public static void GetGraphPoints(this Path path, IDrawingBoardHolder holder, out Point a, out Point b, out Point c, out Point d) { path.GetScreenPoints(out a, out b, out c, out d); a = new Point(holder.PixelToGraphX(a.X), holder.PixelToGraphY(a.Y)); b = new Point(holder.PixelToGraphX(b.X), holder.PixelToGraphY(b.Y)); c = new Point(holder.PixelToGraphX(c.X), holder.PixelToGraphY(c.Y)); d = new Point(holder.PixelToGraphX(d.X), holder.PixelToGraphY(d.Y)); }
private void GenerateBezierUi(IBezierGroup bezierGroup, Canvas canvas, IDrawingBoardHolder eventsHolder) { canvas.Children.Clear(); DrawLines(); _beziers.Clear(canvas, eventsHolder); foreach (var f in bezierGroup.Fragments) { _beziers.AddBezier(canvas, eventsHolder, f); } }
public BezierLinkedList AddBezier(Canvas canvas, IDrawingBoardHolder eh, IBezierFragment bf) { var newNode = new BezierCurve(this, Count); canvas.Children.Add(newNode.Line1); canvas.Children.Add(newNode.Line2); canvas.Children.Add(newNode.Path); canvas.Children.Add(newNode.Start); canvas.Children.Add(newNode.End); canvas.Children.Add(newNode.Control1); canvas.Children.Add(newNode.Control2); newNode.Start.MouseDown += eh.OnStartPointMouseDown; newNode.End.MouseDown += eh.OnEndPointMouseDown; newNode.Control1.MouseDown += eh.OnControl1PointMouseDown; newNode.Control2.MouseDown += eh.OnControl2PointMouseDown; var a = new Point(eh.GraphToPixelX(bf.From.X), eh.GraphToPixelY(bf.From.Y)); var b = new Point(eh.GraphToPixelX(bf.B.X), eh.GraphToPixelY(bf.B.Y)); var c = new Point(eh.GraphToPixelX(bf.C.X), eh.GraphToPixelY(bf.C.Y)); var d = new Point(eh.GraphToPixelX(bf.To.X), eh.GraphToPixelY(bf.To.Y)); newNode.PathFigure.StartPoint = a; newNode.BezierSegment.Point1 = b; newNode.BezierSegment.Point2 = c; newNode.BezierSegment.Point3 = d; newNode.Start.SetValue(Canvas.LeftProperty, a.X - HalfEllipseWidth); newNode.Start.SetValue(Canvas.TopProperty, a.Y - HalfEllipseWidth); newNode.End.SetValue(Canvas.LeftProperty, d.X - HalfEllipseWidth); newNode.End.SetValue(Canvas.TopProperty, d.Y - HalfEllipseWidth); newNode.Control1.SetValue(Canvas.LeftProperty, b.X - HalfEllipseWidth); newNode.Control1.SetValue(Canvas.TopProperty, b.Y - HalfEllipseWidth); newNode.Control2.SetValue(Canvas.LeftProperty, c.X - HalfEllipseWidth); newNode.Control2.SetValue(Canvas.TopProperty, c.Y - HalfEllipseWidth); newNode.SetLines(); if (Last == null) { First = Last = newNode; } else { var last = (BezierCurve)Last; newNode.Previous = last; last.Next = newNode; Last = newNode; } ++Count; return(this); }
public static StringBuilder AppendCurves( this StringBuilder sb, IEnumerable <IBezierCurve> curves, IDrawingBoardHolder holder, Func <Point, Point, Point, Point, string> format) { foreach (var curve in curves) { Point a, b, c, d; curve.Path.GetGraphPoints(holder, out a, out b, out c, out d); sb.AppendLine(format(a, b, c, d)); } return(sb); }
public BezierLinkedList Clear(Canvas canvas, IDrawingBoardHolder eventsHolder) { foreach (var n in this) { n.Start.MouseDown -= eventsHolder.OnStartPointMouseDown; n.End.MouseDown -= eventsHolder.OnEndPointMouseDown; n.Control1.MouseDown -= eventsHolder.OnControl1PointMouseDown; n.Control2.MouseDown -= eventsHolder.OnControl2PointMouseDown; n.Start.Tag = n.End.Tag = n.Control1.Tag = n.Control2.Tag = null; canvas.Children.Remove(n.Path); canvas.Children.Remove(n.Start); canvas.Children.Remove(n.End); canvas.Children.Remove(n.Control1); canvas.Children.Remove(n.Control2); } Count = 0; First = null; Last = null; return(this); }
public MainWindow() { _eh = this; InitializeComponent(); var t = new TransformGroup(); t.Children.Add(_scaleTransform = new ScaleTransform(1, 1, CanvasHalfWidth, CanvasHalfHeight)); t.Children.Add(_translateTransform = new TranslateTransform(0, 0)); TheCanvas.RenderTransform = t; _timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(80) }; _timer.Tick += OnTimerTick; KeyDown += MainWindow_KeyDown; MouseWheel += TheCanvas_MouseWheel; MouseLeftButtonDown += MainWindow_MouseLeftButtonDown; MouseMove += MainWindow_MouseMove; MouseLeftButtonUp += MainWindow_MouseLeftButtonUp; var nameSuffix = ""; //if (ApplicationDeployment.IsNetworkDeployed) //{ Version version = GetType().Assembly.GetName().Version; nameSuffix = " " + version.Major + "." + version.Minor; //} Title = "YouVisio Grapher" + nameSuffix; _runnerCreator = new FuncRunnerCreator(); ReDrawCanvas(); }
public string ToCode(IDrawingBoardHolder holder) { if (Count == 0) { return(""); } Point a, b, c, d; First.Path.GetGraphPoints(holder, out a, out b, out c, out d); if (Count == 1) { const double tolerance = 0.000001; if (abs(a.X) < tolerance && abs(a.Y) < tolerance && abs(d.X - 1) < tolerance && abs(d.Y - 1) < tolerance) { return($"bezier(x,{b.X:N2},{b.Y:N2},{c.X:N2},{c.Y:N2})"); } return($"bezier(x,{a.X:N2},{a.Y:N2},{b.X:N2},{b.Y:N2},{c.X:N2},{c.Y:N2},{d.X:N2},{d.Y:N2})"); } if (Count == 2) { Point e, f, g, h; Last.Path.GetGraphPoints(holder, out e, out f, out g, out h); return("bezier2parts(x,\n" + $" {a.X:N2}, {a.Y:N2}, {b.X:N2}, {b.Y:N2}, {c.X:N2}, {c.Y:N2},\n" + $" {e.X:N2}, {e.Y:N2}, {f.X:N2}, {f.Y:N2}, {g.X:N2}, {g.Y:N2}, {h.X:N2}, {h.Y:N2})"); } if (Count == 3) { Point e, f, g, h; First.Next.Path.GetGraphPoints(holder, out e, out f, out g, out h); Point i, j, k, l; First.Next.Next.Path.GetGraphPoints(holder, out i, out j, out k, out l); return("bezier3parts(x,\n" + $" {a.X:N2}, {a.Y:N2}, {b.X:N2}, {b.Y:N2}, {c.X:N2}, {c.Y:N2},\n" + $" {e.X:N2}, {e.Y:N2}, {f.X:N2}, {f.Y:N2}, {g.X:N2}, {g.Y:N2},\n" + $" {i.X:N2}, {i.Y:N2}, {j.X:N2}, {j.Y:N2}, {k.X:N2}, {k.Y:N2}, {l.X:N2}, {l.Y:N2})"); } if (Count == 4) { Point e, f, g, h; First.Next.Path.GetGraphPoints(holder, out e, out f, out g, out h); Point i, j, k, l; First.Next.Next.Path.GetGraphPoints(holder, out i, out j, out k, out l); Point m, n, o, p; First.Next.Next.Next.Path.GetGraphPoints(holder, out m, out n, out o, out p); return("bezier4parts(x,\n" + $" {a.X:N2}, {a.Y:N2}, {b.X:N2}, {b.Y:N2}, {c.X:N2}, {c.Y:N2},\n" + $" {e.X:N2}, {e.Y:N2}, {f.X:N2}, {f.Y:N2}, {g.X:N2}, {g.Y:N2},\n" + $" {i.X:N2}, {i.Y:N2}, {j.X:N2}, {j.Y:N2}, {k.X:N2}, {k.Y:N2},\n" + $" {m.X:N2}, {m.Y:N2}, {n.X:N2}, {n.Y:N2}, {o.X:N2}, {o.Y:N2},\n" + $" {p.X:N2}, {p.Y:N2})"); } return (new StringBuilder() .AppendLine($"return beziers(b => b.from({a.X:N2},{a.Y:N2})") .AppendCurves(this, holder, (a1, b1, c1, d1) => $" .to({d1.X:N2},{d1.Y:N2}).curve({b1.X:N2},{b1.Y:N2},{c1.X:N2},{c1.Y:N2})") .AppendLine(").run(x)") .ToString()); }