Example #1
0
        //判断图例的形状:线形or矩形
        private bool JudgeLegendForm(DataCollection dc)
        {
            bool likeline = true;

            switch (dc.ChartType)
            {
            case Chart2DTypeEnum.LineChart:
                likeline = true;
                break;

            case Chart2DTypeEnum.AreaChart:
            case Chart2DTypeEnum.BarChart:
            case Chart2DTypeEnum.PieChart:
                likeline = false;
                break;

            case Chart2DTypeEnum.PolorChart:
                DataCollectionPolar dcp = dc as DataCollectionPolar;
                if (dcp.PolarChartType == PolarCharts.PolarChartTypeEnum.Radar || dcp.PolarChartType == PolarCharts.PolarChartTypeEnum.Spline)
                {
                    likeline = true;
                }
                else if (dcp.PolarChartType == PolarCharts.PolarChartTypeEnum.RadarPolygon || dcp.PolarChartType == PolarCharts.PolarChartTypeEnum.Rose)
                {
                    likeline = false;
                }
                break;
            }
            return(likeline);
        }
 public PolarControl()
 {
     InitializeComponent();
     cs             = new ChartStylePolar();
     dc             = new DataCollectionPolar();
     ds             = new DataSeries();
     cs.ChartCanvas = chartCanvas;
 }
Example #3
0
        public void Plot(Canvas canvas, double min, double max, int directions)
        {
            var cs = new ChartStylePolar();

            cs.ChartCanvas    = canvas;
            cs.Rmin           = min;
            cs.Rmax           = max;
            cs.NTicks         = 4;
            cs.AngleStep      = 360 / directions;
            cs.AngleOffset    = -90;
            cs.AngleDirection = ChartStylePolar.AngleDirectionEnum.ClockWise;
            cs.LinePattern    = ChartStylePolar.LinePatternEnum.Dot;
            cs.LineColor      = Brushes.Black;
            cs.SetPolarAxes(true);

            var dc = new DataCollectionPolar();

            foreach (var plot in _plots.Values)
            {
                var ds = new DataSeries();
                ds.LineColor = new SolidColorBrush(plot.LineColor);
                var fill = new SolidColorBrush(plot.FillColor);
                fill.Opacity       = .5;
                ds.LineSeries.Fill = fill;

                var dt = 360 / directions / 2;
                foreach (var sector in plot.Points)
                {
                    ds.LineSeries.Points.Add(new Point(0, cs.Rmin));
                    for (int i = 0; i <= cs.AngleStep; i++)
                    {
                        double angle = i + sector.Direction * cs.AngleStep - dt;
                        ds.LineSeries.Points.Add(new Point(angle, sector.Value));
                    }
                    ds.LineSeries.Points.Add(new Point(0, cs.Rmin));
                }
                dc.DataList.Add(ds);
            }
            dc.AddPolar(cs);
        }
Example #4
0
        internal static void AddPolar(DataCollectionPolar dc, Graphics g, ChartStyle cs, RAxis ra)
        {
            if (!dc.CheckNegative())
            {
                return;
            }
            float      xc     = cs.polarArea.X + cs.polarArea.Width / 2;
            float      yc     = cs.polarArea.Y + cs.polarArea.Height / 2;
            Pen        aPen   = null;
            SolidBrush aBrush = null;

            // Plot lines:
            //雷达图
            if (dc.PolarChartType == PolarChartTypeEnum.Radar || dc.PolarChartType == PolarChartTypeEnum.RadarPolygon)
            {
                foreach (DataSeries ds in dc.DataSeriesList)
                {
                    aBrush         = new SolidBrush(ds.FillColor);
                    aPen           = new Pen(ds.LineStyle.LineColor, ds.LineStyle.LineThickness);
                    aPen.DashStyle = ds.LineStyle.LinePattern;
                    PointF[] pts = new PointF[ds.PointList.Count];
                    for (int i = 0; i < ds.PointList.Count; i++)
                    {
                        pts[i] = cs.Point2DR((PointF)ds.PointList[i], ra);
                    }

                    if (ds.LineStyle.IsVisible == true)
                    {
                        g.DrawPolygon(aPen, pts);
                    }
                    if (dc.PolarChartType == PolarChartTypeEnum.RadarPolygon)
                    {
                        g.FillPolygon(aBrush, pts);
                    }
                }
            }
            //玫瑰图
            else if (dc.PolarChartType == PolarChartTypeEnum.Rose)
            {
                Dictionary <float, float> rSum = new Dictionary <float, float>();
                for (int a = 0; a < 360 / ra.AngleStep; a++)
                {
                    rSum.Add(a * ra.AngleStep, 0);
                }
                foreach (DataSeries ds in dc.DataSeriesList)
                {
                    foreach (PointF p in ds.PointList)
                    {
                        if (p.Y < 0)
                        {
                            return;
                        }
                        if (rSum.ContainsKey(p.X))
                        {
                            rSum[p.X] += p.Y;
                        }
                        else
                        {
                            return;
                        }
                    }
                }
                for (int i = dc.DataSeriesList.Count - 1; i >= 0; i--)
                {
                    DataSeries ds = (DataSeries)dc.DataSeriesList[i];
                    aBrush         = new SolidBrush(ds.FillColor);
                    aPen           = new Pen(ds.LineStyle.LineColor, ds.LineStyle.LineThickness);
                    aPen.DashStyle = ds.LineStyle.LinePattern;
                    //ds.LineStyle.IsVisible = false;

                    float sweepAngle  = ra.AngleStep * dc.RoseBarWidth;
                    float pStartAngle = 0;
                    int   pBarLeng    = 0;
                    foreach (PointF p in ds.PointList)
                    {
                        pStartAngle = p.X + ra.StartAngle - sweepAngle / 2;
                        pBarLeng    = (int)Math.Ceiling(cs.RNorm(rSum[p.X], ra));
                        Rectangle rect1 = new Rectangle((int)xc - pBarLeng, (int)yc - pBarLeng, pBarLeng * 2, pBarLeng * 2);
                        g.FillPie(aBrush, rect1, pStartAngle, sweepAngle);
                        if (ds.LineStyle.IsVisible)
                        {
                            g.DrawPie(aPen, rect1, pStartAngle, sweepAngle);
                        }
                        rSum[p.X] -= p.Y;
                    }
                }
            }
            //曲线图
            else if (dc.PolarChartType == PolarChartTypeEnum.Spline)
            {
                foreach (DataSeries ds in dc.DataSeriesList)
                {
                    aPen           = new Pen(ds.LineStyle.LineColor, ds.LineStyle.LineThickness);
                    aPen.DashStyle = ds.LineStyle.LinePattern;
                    PointF[] pts = new PointF[ds.PointList.Count];

                    if (ds.LineStyle.IsVisible == true)
                    {
                        for (int i = 0; i < ds.PointList.Count; i++)
                        {
                            pts[i] = cs.Point2DR((PointF)ds.PointList[i], ra);
                        }
                        g.DrawClosedCurve(aPen, pts);
                    }
                }
            }

            // Plot Symbols:
            if (dc.PolarChartType == PolarChartTypeEnum.Radar || dc.PolarChartType == PolarChartTypeEnum.Spline)
            {
                foreach (DataSeries ds in dc.DataSeriesList)
                {
                    for (int i = 0; i < ds.PointList.Count; i++)
                    {
                        PointF pt = cs.Point2DR((PointF)ds.PointList[i], ra);
                        if (!pt.IsEmpty)
                        {
                            ds.SymbolStyle.DrawSymbol(g, pt);
                        }
                    }
                }
            }
            if (aPen != null)
            {
                aPen.Dispose();
            }
            if (aBrush != null)
            {
                aBrush.Dispose();
            }
        }