/// <summary> /// 绘制某位置的选中状态(使用一个矩形); /// </summary> /// <param name="point"></param> public static void DrawSelectedPointState(Vector2D point, ICanvas canvas, ICanvasScreenConvertable canvasProxy) { if (point == null) { throw new ArgumentNullException(nameof(point)); } if (canvas == null) { throw new ArgumentNullException(nameof(canvas)); } if (canvasProxy == null) { throw new ArgumentNullException(nameof(canvasProxy)); } //得到以某点为中心的视图矩形; var rect = NativeGeometryExtensions.GetNativeSuroundingScreenRect( canvasProxy.ToScreen(point), TolerantedScreenLength, TolerantedScreenLength ); canvas.NativeDrawRectangle( rect, HighLightRectColorBrush, HighLightLinePen ); }
/// <summary> /// 为未完成的线段绘制角度信息,该角度将X正半轴作为起始边; /// </summary> /// <param name="canvas"></param> /// <param name="canvasProxy"></param> /// <param name="editingLine"></param> public static void DrawEditingLineArcString(ICanvas canvas, ICanvasScreenConvertable canvasProxy, Line2D editingLine) { if (canvas == null) { throw new ArgumentNullException(nameof(canvas)); } if (canvasProxy == null) { throw new ArgumentNullException(nameof(canvasProxy)); } if (editingLine == null) { throw new ArgumentNullException(nameof(editingLine)); } var start = editingLine.Start; var end = editingLine.End; ///得到弧的两条边的向量(以<see cref="editingLine.Start"/>为起点),这两条边的长度相等; var lineVector = end - start; var xAxisLineVector = Vector2D.BasisX * lineVector.Modulus(); //确定角度; var radAngle = Vector2D.BasisX.AngleTo(lineVector); var degAngle = (int)(Extension.RadToDeg(radAngle)); //确定需要绘制角度的位置; var stringPosition = (lineVector + xAxisLineVector).Normalize() * lineVector.Modulus() + start; canvas.DrawText(degAngle.ToString(), 12, LineEditingTipBrush, stringPosition); }
/// <summary> /// 绘制选择状态; /// </summary> /// <param name="canvas"></param> /// <param name="canvasProxy"></param> private void DrawSelectedState(ICanvas canvas, ICanvasScreenConvertable canvasProxy) { if (!IsSelected) { return; } if (Rectangle2D == null) { return; } //绘制四边的中点; var lines = Rectangle2D.GetLines(); var rectLength = TolerantedScreenLength; foreach (var line in lines) { var point = line.MiddlePoint; var rect = NativeGeometryExtensions.GetNativeSuroundingScreenRect(canvasProxy.ToScreen(point), rectLength, rectLength); canvas.NativeDrawRectangle(rect, HighLightEllipseColorBrush, HighLightLinePen); } //绘制中心; var centerPointX = Rectangle2D.GetVertexes().Average(p => p.X); var centerPointY = Rectangle2D.GetVertexes().Average(p => p.Y); var centerScreenPoint = canvasProxy.ToScreen(new Vector2D(centerPointX, centerPointY)); var centerRect = NativeGeometryExtensions.GetNativeSuroundingScreenRect(centerScreenPoint, rectLength, rectLength); canvas.NativeDrawRectangle(centerRect, HighLightEllipseColorBrush, HighLightLinePen); }
/// <summary> /// 交点绘制; /// </summary> /// <param name="canvas"></param> /// <param name="canvasProxy"></param> public override void Draw(ICanvas canvas, ICanvasScreenConvertable canvasProxy) { if (canvas == null) { throw new ArgumentNullException(nameof(canvas)); } if (canvasProxy == null) { throw new ArgumentNullException(nameof(canvasProxy)); } //画叉; var screenPosition = canvasProxy.ToScreen(Position); var rectLength = HighLightRectLength; //从左上到右下; var line1 = new Line2D( new Vector2D(screenPosition.X - rectLength, screenPosition.Y - rectLength), new Vector2D(screenPosition.X + rectLength, screenPosition.Y + rectLength) ); //从左下到右上; var line2 = new Line2D( new Vector2D(screenPosition.X - rectLength, screenPosition.Y + rectLength), new Vector2D(screenPosition.X + rectLength, screenPosition.Y - rectLength) ); canvas.NativeDrawLine(IntersectPen, line1); canvas.NativeDrawLine(IntersectPen, line2); }
/// <summary> /// 绘制未完成的编辑的线段及其提示; /// </summary> /// <param name="canvas"></param> /// <param name="canvasProxy"></param> /// <param name="editingLine"></param> public static void DrawEditingLine(ICanvas canvas, ICanvasScreenConvertable canvasProxy, Line2D editingLine) { //绘制未完成线段; canvas.DrawLine(LinePen, editingLine); DrawEditingLineOutLines(canvas, canvasProxy, editingLine); DrawEditingLineLengthString(canvas, canvasProxy, editingLine); DrawEditingLineArc(canvas, canvasProxy, editingLine); DrawEditingLineArcString(canvas, canvasProxy, editingLine); }
public override void Draw(ICanvas canvas, ICanvasScreenConvertable canvasProxy) { base.Draw(canvas, canvasProxy); canvas.DrawEllipse(null, new Pen { Brush = Brushes.Purple, Thickness = 2 }, Vector2D.Zero, 2, 4); canvas.DrawText("This is a custom drawObject", 12, Brushes.White, new Vector2D(-1, 0)); }
public override bool PointInObject(Vector2D point, ICanvasScreenConvertable canvasProxy) { if (point == null) { throw new ArgumentNullException(nameof(point)); } if (canvasProxy == null) { throw new ArgumentNullException(nameof(canvasProxy)); } if (Rectangle2D == null) { return(false); } var screenPoint = canvasProxy.ToScreen(point); //判断与中心的关系; var centerScreenPoint = canvasProxy.ToScreen(Rectangle2D.Center); var screenRect = Tida.Canvas.Infrastructure.Utils.NativeGeometryExtensions.GetNativeSuroundingScreenRect( centerScreenPoint, TolerantedScreenLength, TolerantedScreenLength ); if (screenRect.Contains(screenPoint)) { return(true); } //判断与四边的关系; var lines = Rectangle2D.GetLines(); var screenStartPoint = new Vector2D(); var screenEndPoint = new Vector2D(); foreach (var line in lines) { canvasProxy.ToScreen(line.Start, screenStartPoint); canvasProxy.ToScreen(line.End, screenEndPoint); var screenLine2D = new Line2D( screenStartPoint, screenEndPoint ); if (screenLine2D.Distance(screenPoint) < TolerantedScreenLength) { return(true); } } return(false); }
/// <summary> /// 为未完成的线段绘制角度弧形,该弧将X正半轴作为起始边; /// </summary> /// <param name="canvas"></param> /// <param name="canvasProxy"></param> /// <param name="editingLine"></param> public static void DrawEditingLineArc(ICanvas canvas, ICanvasScreenConvertable canvasProxy, Line2D editingLine) { var start = editingLine.Start; var end = editingLine.End; var angle = (end - start).AngleFrom(Vector2D.BasisX); //弧度化为角度; var degAngle = Extension.RadToDeg(angle); canvas.DrawArc(LineEditingTipPen, start, editingLine.Length, 0, angle, true); canvas.DrawLine(LineEditingTipPen, new Line2D(start, new Vector2D(start.X + editingLine.Length, start.Y))); //canvas.DrawArc(Constants.LineEditingTipPen, new Vector2D(0, 0), 31, 0, 3.14); //canvas.DrawText(angle.ToString(), 18, new Media.SolidColorBrush { Color = Media.Color.FromRgb(0xFFFFFF) }, new Vector2D(0, 0)); }
private LengthNumContainerForMouseTrackable( THaveMousePositionTracker haveMousePositionTracker, NumberBoxInteractionHandler lengthInteractionHandler, ICanvasScreenConvertable canvasProxy ) : base( new NumberBoxInteractionHandler[] { lengthInteractionHandler } ) { HaveMousePositionTracker = haveMousePositionTracker ?? throw new ArgumentNullException(nameof(haveMousePositionTracker)); CanvasProxy = canvasProxy ?? throw new ArgumentNullException(nameof(canvasProxy)); _lengthInteractionHandler = lengthInteractionHandler ?? throw new ArgumentNullException(nameof(lengthInteractionHandler)); Initialize(); }