/// <summary> /// 绘制路径(未封闭区域); /// </summary> /// <param name="pen"></param> /// <param name="points"></param> public void DrawCurve(Pen pen, IEnumerable <Vector2D> points) { if (pen == null) { throw new ArgumentNullException(nameof(pen)); } ValidateDrawingContext(); //使用一个变量存储上一次的视图点; Point?lastScreenPoint = null; var sysPen = PenAdapter.ConverterToSystemPen(pen); foreach (var point in points) { var thisScreenPoint = ConvertVectorToScreenPoint(point); if (lastScreenPoint != null) { //绘制的是上一次的节点到这一次的节点; DrawingContext.DrawLine(sysPen, lastScreenPoint.Value, thisScreenPoint); } lastScreenPoint = thisScreenPoint; } //var path = GetCurveGeometry(points); //DrawingContext.DrawGeometry(null, sysPen, path); }
/// <summary> /// 绘制圆弧; /// </summary> /// <param name="pen"></param> /// <param name="center"></param> /// <param name="radius"></param> /// <param name="beginangle"></param> /// <param name="angle"></param> public void DrawArc(Pen pen, Vector2D center, double radius, double beginangle, double angle, bool smallAngle) { ValidateDrawingContext(); beginangle %= (Math.PI * 2); angle %= (Math.PI * 2); var centerPoint = ConvertVectorToScreenPoint(center); var endAngle = beginangle + angle; var startPoint = new Vector2D(center.X + Math.Cos(beginangle) * radius, center.Y + Math.Sin(beginangle) * radius); var endPoint = new Vector2D(center.X + Math.Cos(endAngle) * radius, center.Y + Math.Sin(endAngle) * radius); var startScreenPoint = ConvertVectorToScreenPoint(startPoint); var endScreenPoint = ConvertVectorToScreenPoint(endPoint); //求两边之叉积,由叉积的符号决定是顺时针和逆时针; var cross = Math.Cos(beginangle) * Math.Sin(endAngle) - Math.Sin(beginangle) * Math.Cos(endAngle); var screenRadius = _canvasProxy.ToScreen(radius); //因为数学坐标中, var arcGeometry = GetArcGeometry( startScreenPoint, endScreenPoint, screenRadius, smallAngle, cross < 0 ? SystemMedia.SweepDirection.Clockwise: SystemMedia.SweepDirection.Counterclockwise ); DrawingContext.DrawGeometry( null, PenAdapter.ConverterToSystemPen(pen), arcGeometry ); }
/// <summary> /// 以视图坐标为标准,绘制椭圆; /// </summary> /// <param name="rectangle">以视图坐标为准的矩形</param> /// <param name="brush">填充色</param> /// <param name="pen">笔</param> public void NativeDrawEllipse(Brush brush, Pen pen, Vector2D center, double radiusX, double radiusY) { if (center == null) { throw new ArgumentNullException(nameof(center)); } var centerPoint = Vector2DAdapter.ConvertToSystemPoint(center); DrawingContext.DrawEllipse( BrushAdapter.ConvertToSystemBrush(brush), PenAdapter.ConverterToSystemPen(pen), centerPoint, radiusX, radiusY ); }
/// <summary> /// 以视图坐标为标准,绘制矩形; /// </summary> /// <param name="rectangle">以视图坐标为准的矩形</param> /// <param name="brush">填充色</param> /// <param name="pen">笔</param> public void NativeDrawRectangle(Rectangle2D2 rectangle, Brush brush, Pen pen) { if (rectangle == null) { throw new ArgumentNullException(nameof(rectangle)); } ValidateDrawingContext(); var vertexes = rectangle.GetVertexes(); NativeDrawFill( vertexes.Select(p => Vector2DAdapter.ConvertToSystemPoint(p)), BrushAdapter.ConvertToSystemBrush(brush), PenAdapter.ConverterToSystemPen(pen) ); }
/// <summary> /// 根据所有的点,组成一个封闭区域,且可以填充,并且填充 /// </summary> /// <param name="points">所有的顶点坐标</param> /// <param name="brush">区域颜色</param> private void DrawFill(IEnumerable <Vector2D> points, Brush brush, Pen pen) { if (points == null) { throw new ArgumentNullException(nameof(points)); } if (pen == null) { throw new ArgumentNullException(nameof(pen)); } ValidateDrawingContext(); NativeDrawFill( points.Select(p => ConvertVectorToScreenPoint(p)), BrushAdapter.ConvertToSystemBrush(brush), PenAdapter.ConverterToSystemPen(pen) ); }
/// <summary> /// 以视图坐标为标准,绘制线段; /// </summary> /// <param name="rectangle">以视图坐标为准的矩形</param> /// <param name="brush">填充色</param> /// <param name="pen">笔</param> public void NativeDrawLine(Pen pen, Line2D line2D) { if (pen == null) { return; } if (line2D == null) { throw new ArgumentNullException(nameof(line2D)); } ValidateDrawingContext(); //平台转换后再进行绘制; DrawingContext.DrawLine( PenAdapter.ConverterToSystemPen(pen), Vector2DAdapter.ConvertToSystemPoint(line2D.Start), Vector2DAdapter.ConvertToSystemPoint(line2D.End) ); }
/// <summary> /// 绘制线段; /// </summary> /// <param name="pen"></param> /// <param name="line"></param> public void DrawLine(Pen pen, Line2D line) { if (pen == null) { return; } if (line == null) { throw new ArgumentNullException(nameof(line)); } ValidateDrawingContext(); var screenPoint1 = _canvasProxy.ToScreen(line.Start); var screenPoint2 = _canvasProxy.ToScreen(line.End); //平台转换后再进行绘制; DrawingContext.DrawLine( PenAdapter.ConverterToSystemPen(pen), Vector2DAdapter.ConvertToSystemPoint(screenPoint1), Vector2DAdapter.ConvertToSystemPoint(screenPoint2) ); }