internal void DrawHandle(CanvasDrawingSession win2d, DrawingPoint befor, bool atlast) { if (atlast && befor != null) { if (befor.IsHaveControlPoint) { var cp = befor.getControlPoint(false); var pt = befor.getPoint(); win2d.DrawLine(pt, cp, Colors.Green); DrawHandle_sub(win2d, cp.X, cp.Y, true, Colors.Green); } } if (_haveControlPoint) { DrawHandle_sub(win2d, _point.X, _point.Y, true, Colors.Blue); if (atlast) { var x = _point.X - (_controlPoint0.X - _point.X); var y = _point.Y - (_controlPoint0.Y - _point.Y); win2d.DrawLine(new Vector2(x, y), _controlPoint0, Colors.Green); DrawHandle_sub(win2d, x, y, true, Colors.Green); } DrawHandle_sub(win2d, _controlPoint0.X, _controlPoint0.Y, true, Colors.Green); } else { DrawHandle_sub(win2d, _point.X, _point.Y, false, Colors.Blue); } }
internal void Reset() { if (_points != null) { _points.Clear(); } statePress = false; movePoint = null; pressPoint = null; _mainPage.EditCanvasInvalidate(); }
void MakePath(ref CanvasPathBuilder path, DrawingPoint befor, DrawingPoint target) { if (befor.IsHaveControlPoint || target.IsHaveControlPoint) { // canvasPathBuilder.AddLine(200, 200); // canvasPathBuilder.AddCubicBezier(new Vector2(250, 300), new Vector2(250, 300), new Vector2(300, 200)); Vector2 controlpoint1 = befor.getControlPoint(false); Vector2 controlpoint2 = target.getControlPoint(true); path.AddCubicBezier(controlpoint1, controlpoint2, target.getPoint()); } else { path.AddLine(target.getPoint()); } }
internal void Draw(CanvasDrawingSession ds, ViewInfo viewInfo) { // var dt = DateTime.Now; // System.Diagnostics.Debug.WriteLine(string.Format("Draw:time:{0}",dt.ToString("mm:ss:fff"))); // if (_points != null && _points.Count > 0) if (_points != null && _points.Count > 0) { ds.Transform = new Matrix3x2(1, 0, 0, 1, viewInfo.OffsetX, viewInfo.OffsetY); if (_points.Count > 1 || !statePress) { var canvasPathBuilder = new Microsoft.Graphics.Canvas.Geometry.CanvasPathBuilder(ds); int index = 0; DrawingPoint befor = _points[index]; DrawingPoint tp = null; index++; canvasPathBuilder.BeginFigure(befor.getPoint()); for (; index < _points.Count; index++) { tp = _points[index]; MakePath(ref canvasPathBuilder, befor, tp); befor = tp; tp = null; } canvasPathBuilder.EndFigure(CanvasFigureLoop.Open); ds.DrawGeometry(CanvasGeometry.CreatePath(canvasPathBuilder), Colors.HotPink, 1); } { DrawingPoint befor = null; DrawingPoint tp = null; for (int index = 0; index < _points.Count; index++) { tp = _points[index]; tp.DrawHandle(ds, befor, index == _points.Count - 1); befor = tp; } } } }
/// <summary> /// マウスイベント /// </summary> /// <param name="kind"></param> /// <param name="pos"></param> internal void PointerEvent(MouseEventKind kind, Vector2 pos) { if (_points == null) { _points = new List <DrawingPoint>(); } pos = snapPos(pos); switch (kind) { case MouseEventKind.Press: { _mainPage.FocusMove(); statePress = true; System.Diagnostics.Debug.WriteLine("Event:Press"); if (movePoint != null) { pressPoint = movePoint; movePoint = null; } else { pressPoint = new DrawingPoint(pos); _points.Add(pressPoint); } currentPoint = pos; Invalidate(); } break; case MouseEventKind.Move: if (_points.Count > 0) { if (pos != currentPoint) { currentPoint = pos; if (pressPoint != null) { pressPoint.UpdateKind(pos); } else { if (movePoint == null) { movePoint = new DrawingPoint(pos); _points.Add(movePoint); } movePoint.SetPos(pos); } Invalidate(); } } break; case MouseEventKind.Release: System.Diagnostics.Debug.WriteLine("Event:Release"); if (statePress) { statePress = false; pressPoint = null; if (_points != null && _points.Count >= 3) { var p0 = _points[0].getPoint(); var p1 = _points[_points.Count - 1].getPoint(); if (p0 == p1) { _mainPage.CreatePath(_points, true); CancelEvent(); } } Invalidate(); } break; case MouseEventKind.Double: if (_points.Count > 2) { _points.RemoveAt(_points.Count - 1); _mainPage.CreatePath(_points, false); } CancelEvent(); // _poits 等もクリア break; } }