Newer
Older
Correlator / PipeGallery / Model / CoordinatesInfo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;

namespace PipeGallery.Model
{
    /// <summary>
    /// 坐标系类
    /// </summary>
    public class CoordinatesInfoType
    {

        public CoordinatesInfoType()
        {

        }

        private string _yName = string.Empty;

        public string YName
        {
            get { return _yName; }
            set { _yName = value; }
        }


        private double _yMaxValue;
        //Y轴最大值
        public double YMaxValue
        {
            get { return _yMaxValue; }
            set { _yMaxValue = value; }
        }

        private double _yMinValue;
        //Y轴最小值
        public double YMinValue
        {
            get { return _yMinValue; }
            set { _yMinValue = value; }
        }

        private int _yMarkCount;
        //Y轴刻度个数
        public int YMarkCount
        {
            get { return _yMarkCount; }
            set { _yMarkCount = value; }
        }

        private string _xName = string.Empty;
        //X轴的名称
        public string XName
        {
            get { return _xName; }
            set { _xName = value; }
        }

        private double _xMaxValue;
        //X轴最大值
        public double XMaxValue
        {
            get { return _xMaxValue; }
            set { _xMaxValue = value; }
        }

        private double _xMinValue;
        //X轴最小值
        public double XMinValue
        {
            get { return _xMinValue; }
            set { _xMinValue = value; }
        }

        private int _xMarkCount;
        //X轴刻度个数
        public int XMarkCount
        {
            get { return _xMarkCount; }
            set { _xMarkCount = value; }
        }



        #region 绘制平面曲线坐标系
        //坐标轴的左边沿的X坐标点
        double _xs;
        //坐标轴的X轴的实际长度
        double _xw;
        //坐标轴下边沿的Y坐标点
        double _ys;
        //坐标轴的Y轴的实际长度
        double _yh;

        string _color;

        internal void DrawCoordinates(Canvas canvas, bool isXMark = false, ChartType chartType = ChartType.HomePageView)
        {
            //清空canvas
            canvas.Children.Clear();

            //坐标轴的左边沿的X坐标点
            _xs = 0;
            //坐标轴的X轴的实际长度
            _xw = canvas.ActualWidth;
            //坐标轴的Y轴的实际长度
            if (chartType == ChartType.FilterView)
            {
                _yh = canvas.ActualHeight;
            }
            else
            {
                _yh = canvas.ActualHeight - 50;
            }
            //坐标轴下边沿的Y坐标点
            _ys = _yh;

            //坐标轴的Y轴的起点
            Point pYStart = new Point(_xs, _ys);

            //X坐标轴的左起点,原点
            Point pXStart = new Point(); ;
            if (chartType == ChartType.HomePageView)
            {
                pXStart = new Point(_xs, _ys + 10);
            }
            if (chartType == ChartType.AuditionView)
            {
                pXStart = new Point(_xs, _ys + 10);
            }
            if (chartType == ChartType.FilterView)
            {
                pXStart = new Point(_xs, _ys);
            }
            _color = "#545454";
            //画坐刻度
            DrawPlaneCurveMark(canvas, _color, 0, pXStart, pYStart, _xw, _yh, isXMark, chartType);
            //画坐标轴
            DrawPlaneCurveAxis(canvas, _color, 0, pXStart, pYStart, _xw, _yh, chartType);

        }

        /// <summary>
        /// 画一个平面图表的坐标轴
        /// </summary>
        /// <param name="canvas">父容器</param>
        /// <param name="color">坐标系线轴颜色</param>
        /// <param name="offset">偏移量:实现坐标系的阴影</param>
        /// <param name="pYStart">坐标系的Y轴的下起点</param>
        /// <param name="xw">坐标系X轴的实际长度</param>
        /// <param name="yh">坐标系Y轴的实际长度</param>
        internal void DrawPlaneCurveAxis(Canvas canvas, string color, double offset, Point pXStart, Point pYStart, double xw, double yh, ChartType chartType = ChartType.HomePageView)
        {

            PathGeometry axisPathGeometry = new PathGeometry();

            if (chartType == ChartType.FilterView)
            {
                LineGeometry yAxisLeft = new LineGeometry();
                yAxisLeft.StartPoint = new Point(pYStart.X + offset, pYStart.Y);
                yAxisLeft.EndPoint = new Point(pYStart.X + offset, pYStart.Y - yh);
                axisPathGeometry.AddGeometry(yAxisLeft);
            }

            ////画X轴
            if (chartType == ChartType.HomePageView || chartType == ChartType.FilterView)
            {
                LineGeometry xAxis = new LineGeometry();
                xAxis.StartPoint = new Point(pXStart.X, pXStart.Y + offset);
                xAxis.EndPoint = new Point(pXStart.X + xw, pXStart.Y + offset);
                axisPathGeometry.AddGeometry(xAxis);
            }

            Path pathAxis = new Path();
            pathAxis.StrokeThickness = 1;
            pathAxis.Stroke = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color)); ;
            pathAxis.Data = axisPathGeometry;

            canvas.Children.Add(pathAxis);

        }


        /// <summary>
        /// 画一个平面图表的坐标刻度
        /// </summary>
        internal void DrawPlaneCurveMark(Canvas canvas, string color, double offset, Point pXStart, Point pYStart, double xw, double yh, bool isXMark = false, ChartType chartType = ChartType.HomePageView)
        {

            PathGeometry markPathGeometry = new PathGeometry();

            if (isXMark)
            {
                double xMarkWidth = _xw / XMarkCount;
                double xInterval = (XMaxValue - XMinValue) / XMarkCount;
                for (int i = 0; i < XMarkCount + 1; i++)
                {

                    LineGeometry xline = new LineGeometry();
                    xline.StartPoint = new Point(pXStart.X + xMarkWidth * i, pXStart.Y);

                    if (chartType == ChartType.HomePageView || chartType == ChartType.FilterView)
                    {
                        if (i % 2 == 0)
                        {
                            xline.EndPoint = new Point(pXStart.X + xMarkWidth * i, pXStart.Y + 15);
                        }
                        else
                        {
                            xline.EndPoint = new Point(pXStart.X + xMarkWidth * i, pXStart.Y + 5);
                        }
                    }
                    else
                    {
                        if (i % 2 == 0)
                        {
                            xline.EndPoint = new Point(pXStart.X + xMarkWidth * i, pXStart.Y + 20);
                        }
                        else
                        {
                            xline.EndPoint = new Point(pXStart.X + xMarkWidth * i, pXStart.Y + 10);
                        }


                    }

                    markPathGeometry.AddGeometry(xline);

                    if (chartType == ChartType.AuditionView)
                    {
                        LineGeometry xline2 = new LineGeometry();
                        xline2.StartPoint = new Point(pXStart.X + xMarkWidth * i, -10);

                        if (i % 2 == 0)
                        {
                            xline2.EndPoint = new Point(pXStart.X + xMarkWidth * i, -30);
                        }
                        else
                        {
                            xline2.EndPoint = new Point(pXStart.X + xMarkWidth * i, -20);
                        }
                        markPathGeometry.AddGeometry(xline2);
                    }
                }

                if (chartType == ChartType.HomePageView)
                {
                    //TextBlock txtXMarkStartValue = new TextBlock();
                    //txtXMarkStartValue.FontSize = 20;
                    //txtXMarkStartValue.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color));
                    //txtXMarkStartValue.Text = "" + XMinValue.ToString();
                    //Canvas.SetRight(txtXMarkStartValue, xw + 5);
                    //Canvas.SetBottom(txtXMarkStartValue, 40 - 12);
                    //canvas.Children.Add(txtXMarkStartValue);

                    TextBlock txtXName = new TextBlock();
                    txtXName.FontSize = 14;
                    txtXName.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color));
                    txtXName.Text = XName.ToString();
                    Canvas.SetLeft(txtXName, xw + 5);
                    Canvas.SetBottom(txtXName, 40 - 12);
                    canvas.Children.Add(txtXName);
                }
                else if (chartType == ChartType.FilterView)
                {
                    TextBlock txtXMarkMinValue = new TextBlock();
                    txtXMarkMinValue.TextAlignment = TextAlignment.Center;
                    txtXMarkMinValue.Width = 50;
                    txtXMarkMinValue.FontSize = 20;
                    txtXMarkMinValue.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color));
                    txtXMarkMinValue.Text = "" + XMinValue.ToString();
                    Canvas.SetLeft(txtXMarkMinValue, -20);
                    Canvas.SetTop(txtXMarkMinValue, pXStart.Y + 16);
                    canvas.Children.Add(txtXMarkMinValue);

                    TextBlock txtXMarkMaxValue = new TextBlock();
                    txtXMarkMaxValue.TextAlignment = TextAlignment.Center;
                    txtXMarkMaxValue.Width = 50;
                    txtXMarkMaxValue.FontSize = 20;
                    txtXMarkMaxValue.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color));
                    txtXMarkMaxValue.Text = "" + XMaxValue.ToString();
                    Canvas.SetLeft(txtXMarkMaxValue, xw - 20);
                    Canvas.SetTop(txtXMarkMaxValue, pXStart.Y + 16);
                    canvas.Children.Add(txtXMarkMaxValue);

                    TextBlock txtXName = new TextBlock();
                    txtXName.FontSize = 14;
                    txtXName.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color));
                    txtXName.Text = XName.ToString();
                    Canvas.SetLeft(txtXName, xw + 5);
                    Canvas.SetTop(txtXName, pXStart.Y - 7);
                    canvas.Children.Add(txtXName);
                }
            }

            //画Y轴Name
            if (chartType == ChartType.FilterView)
            {
                TextBlock txtYName = new TextBlock();
                txtYName.FontSize = 14;
                txtYName.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color));
                txtYName.Text = YName.ToString();
                Canvas.SetRight(txtYName, xw + 5);
                Canvas.SetTop(txtYName, 0);
                canvas.Children.Add(txtYName);

            }

            Path pathAxis = new Path();
            if (chartType == ChartType.HomePageView)
            {
                pathAxis.StrokeThickness = 1;
            }
            else
            {
                pathAxis.StrokeThickness = 0.5;
            }
            //pathAxis.StrokeDashArray = new DoubleCollection() { 2, 3 };
            pathAxis.Stroke = new SolidColorBrush((Color)ColorConverter.ConvertFromString(color));
            pathAxis.Data = markPathGeometry;
            canvas.Children.Add(pathAxis);
        }

        #endregion


        public double GetXPosition(double x)
        {
            double d1 = x - XMinValue;
            double d2 = XMaxValue - XMinValue;
            double d = _xw * d1 / d2;

            return d;
        }

    }
}