Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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
                );
        }
Exemplo n.º 3
0
        /// <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
                );
        }
Exemplo n.º 4
0
        /// <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)
                );
        }
Exemplo n.º 5
0
        /// <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)
                );
        }
Exemplo n.º 6
0
        /// <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)
                );
        }
Exemplo n.º 7
0
        /// <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)
                );
        }