public void AddAreas(ChartStyleGridlines csg)
        {
            int nSeries = AreaList.Count;
            int nPoints = AreaList[0].AreaSeries.Points.Count;

            double[] ySum = new double[nPoints];
            Point[]  pts  = new Point[2 * nPoints];
            Point[]  pt0  = new Point[nPoints];
            Point[]  pt1  = new Point[nPoints];

            for (int i = 0; i < nPoints; i++)
            {
                ySum[i] = AreaAxis;
            }

            foreach (DataSeriesArea area in AreaList)
            {
                area.AddBorderPattern();
                for (int i = 0; i < nPoints; i++)
                {
                    pt0[i]   = new Point(area.AreaSeries.Points[i].X, ySum[i]);
                    ySum[i] += area.AreaSeries.Points[i].Y;
                    pt1[i]   = new Point(area.AreaSeries.Points[i].X, ySum[i]);
                    pts[i]   = csg.NormalizePoint(pt0[i]);
                    pts[2 * nPoints - 1 - i] = csg.NormalizePoint(pt1[i]);
                }

                area.AreaSeries.Points.Clear();
                for (int i = 0; i < pts.GetLength(0); i++)
                {
                    area.AreaSeries.Points.Add(pts[i]);
                }
                csg.ChartCanvas.Children.Add(area.AreaSeries);
            }
        }
        private void DrawHorizontalBar(Point pt, ChartStyleGridlines csg, DataSeriesBar ds, double width, double x)
        {
            Polygon plg = new Polygon();

            plg.Fill            = ds.FillColor;
            plg.Stroke          = ds.BorderColor;
            plg.StrokeThickness = ds.BorderThickness;

            double y = pt.Y - 0.5 * csg.YTick;

            plg.Points.Add(csg.NormalizePoint(new Point(x, y - width / 2)));
            plg.Points.Add(csg.NormalizePoint(new Point(x, y + width / 2)));
            plg.Points.Add(csg.NormalizePoint(new Point(x + pt.X, y + width / 2)));
            plg.Points.Add(csg.NormalizePoint(new Point(x + pt.X, y - width / 2)));
            csg.ChartCanvas.Children.Add(plg);
        }
        private void DrawVerticalBar(Point pt, ChartStyleGridlines csg, DataSeriesBar ds, double width, double y)
        {
            Polygon plg = new Polygon();

            plg.Fill            = ds.FillColor;
            plg.Stroke          = ds.BorderColor;
            plg.StrokeThickness = ds.BorderThickness;

            double x = pt.X - 0.5 * csg.XTick;

            plg.Points.Add(csg.NormalizePoint(new Point(x - width / 2, y)));
            plg.Points.Add(csg.NormalizePoint(new Point(x + width / 2, y)));
            plg.Points.Add(csg.NormalizePoint(new Point(x + width / 2, y + pt.Y)));
            plg.Points.Add(csg.NormalizePoint(new Point(x - width / 2, y + pt.Y)));
            csg.ChartCanvas.Children.Add(plg);
        }
        public void AddStairstep(ChartStyleGridlines csg)
        {
            foreach (DataSeriesStairstep ds in DataList)
            {
                List <Point> ptList = new List <Point>();
                Point[]      pts    = new Point[2];
                ds.AddStairstepLinePattern();

                // Create Stairstep data:
                for (int i = 0; i < ds.LineSeries.Points.Count - 1; i++)
                {
                    pts[0] = ds.LineSeries.Points[i];
                    pts[1] = ds.LineSeries.Points[i + 1];
                    ptList.Add(pts[0]);
                    ptList.Add(new Point(pts[1].X, pts[0].Y));
                }
                ptList.Add(new Point(pts[1].X, pts[0].Y));

                // Draw stairstep line:
                for (int i = 0; i < ptList.Count; i++)
                {
                    ds.StairstepLineSeries.Points.Add(csg.NormalizePoint(ptList[i]));
                }
                csg.ChartCanvas.Children.Add(ds.StairstepLineSeries);
            }
        }
        public void AddErrorbars(ChartStyleGridlines csg)
        {
            Line line;

            foreach (DataSeriesErrorbar ds in DataList)
            {
                double barLength = (csg.NormalizePoint(ds.LineSeries.Points[1]).X -
                                    csg.NormalizePoint(ds.LineSeries.Points[0]).X) / 3;

                for (int i = 0; i < ds.ErrorLineSeries.Points.Count; i++)
                {
                    Point   ep  = ds.ErrorLineSeries.Points[i];
                    Point   dp  = ds.LineSeries.Points[i];
                    Point[] pts = new Point[2];
                    pts[0]               = csg.NormalizePoint(new Point(dp.X, dp.Y - ep.Y / 2));
                    pts[1]               = csg.NormalizePoint(new Point(dp.X, dp.Y + ep.Y / 2));
                    line                 = new Line();
                    line.Stroke          = ds.ErrorLineColor;
                    line.StrokeThickness = ds.ErrorLineThickness;
                    ds.AddErrorLinePattern();
                    line.X1 = pts[0].X;
                    line.Y1 = pts[0].Y;
                    line.X2 = pts[1].X;
                    line.Y2 = pts[1].Y;
                    csg.ChartCanvas.Children.Add(line);
                    line                 = new Line();
                    line.Stroke          = ds.ErrorLineColor;
                    line.StrokeThickness = ds.ErrorLineThickness;
                    ds.AddErrorLinePattern();
                    line.X1 = pts[0].X - barLength / 2;
                    line.Y1 = pts[0].Y;
                    line.X2 = pts[0].X + barLength / 2;
                    line.Y2 = pts[0].Y;
                    csg.ChartCanvas.Children.Add(line);
                    line                 = new Line();
                    line.Stroke          = ds.ErrorLineColor;
                    line.StrokeThickness = ds.ErrorLineThickness;
                    ds.AddErrorLinePattern();
                    line.X1 = pts[1].X - barLength / 2;
                    line.Y1 = pts[1].Y;
                    line.X2 = pts[1].X + barLength / 2;
                    line.Y2 = pts[1].Y;
                    csg.ChartCanvas.Children.Add(line);
                }
            }
        }
        private void DrawHorizontalBar1(Point pt, ChartStyleGridlines csg, DataSeriesBar ds, int nSeries, int n)
        {
            Polygon plg = new Polygon();

            plg.Fill            = ds.FillColor;
            plg.Stroke          = ds.BorderColor;
            plg.StrokeThickness = ds.BorderThickness;

            double width = 0.7 * csg.YTick;
            double w1    = width / nSeries;
            double w     = ds.BarWidth * w1;
            double space = (w1 - w) / 2;
            double y     = pt.Y - 0.5 * csg.YTick;

            plg.Points.Add(csg.NormalizePoint(new Point(0, y - width / 2 + space + n * w1)));
            plg.Points.Add(csg.NormalizePoint(new Point(0, y - width / 2 + space + n * w1 + w)));
            plg.Points.Add(csg.NormalizePoint(new Point(pt.X, y - width / 2 + space + n * w1 + w)));
            plg.Points.Add(csg.NormalizePoint(new Point(pt.X, y - width / 2 + space + n * w1)));
            csg.ChartCanvas.Children.Add(plg);
        }
        public void AddStems(ChartStyleGridlines csg)
        {
            foreach (DataSeries ds in DataList)
            {
                Point[] pts = new Point[2];
                for (int i = 0; i < ds.LineSeries.Points.Count; i++)
                {
                    pts[0] = csg.NormalizePoint(new Point(ds.LineSeries.Points[i].X, 0));
                    pts[1] = csg.NormalizePoint(ds.LineSeries.Points[i]);

                    Line line = new Line();
                    line.Stroke          = ds.LineColor;
                    line.StrokeThickness = ds.LineThickness;
                    line.X1 = pts[0].X;
                    line.Y1 = pts[0].Y;
                    line.X2 = pts[1].X;
                    line.Y2 = pts[1].Y;
                    csg.ChartCanvas.Children.Add(line);
                    ds.Symbols.AddSymbol(csg.ChartCanvas, csg.NormalizePoint(ds.LineSeries.Points[i]));
                }
            }
        }