aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/SideChains/RealTimeGraphXNet/RealTimeGraphX/Renderers/ScrollingLineRenderer.cs
blob: 0a4ac8368847127b3d50a5b75c6cfd6083b75a26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;

namespace RealTimeGraphX.Renderers
{
    /// <summary>
    /// Represents a scrolling style <see cref="GraphRenderer{TDataSeries}"/>.
    /// </summary>
    /// <typeparam name="TDataSeries">The type of the data series.</typeparam>
    /// <seealso cref="RealTimeGraphX.GraphRenderer{TDataSeries}" />
    public class ScrollingLineRenderer<TDataSeries> : GraphRenderer<TDataSeries> where TDataSeries : IGraphDataSeries
    {
        /// <summary>
        /// Arranges the series of data points and returns a series of drawing points.
        /// </summary>
        /// <param name="surface">The target graph surface.</param>
        /// <param name="series">The instance of the current rendered data series.</param>
        /// <param name="range">Instance of graph range.</param>
        /// <param name="xx">Collection of x coordinates.</param>
        /// <param name="yy">Collection of y coordinates.</param>
        /// <param name="minimumX">The minimum x coordinates value.</param>
        /// <param name="maximumX">The maximum x coordinates value.</param>
        /// <param name="minimumY">The minimum y coordinates value.</param>
        /// <param name="maximumY">The maximum y coordinates value.</param>
        /// <returns></returns>
        public override IEnumerable<PointF> Render(IGraphSurface<TDataSeries> surface, TDataSeries series, IGraphRange range, List<GraphDataPoint> xx, List<GraphDataPoint> yy, GraphDataPoint minimumX, GraphDataPoint maximumX, GraphDataPoint minimumY, GraphDataPoint maximumY)
        {
            var dxList = xx.Select(x => x.ComputeRelativePosition(minimumX, maximumX)).ToList();
            var dyList = yy.Select(x => x.ComputeRelativePosition(minimumY, maximumY)).ToList();

            if (maximumX - minimumX > range.MaximumX)
            {
                var offset = ((maximumX - minimumX) - range.MaximumX) + minimumX;

                for (int i = 0; i < xx.Count; i++)
                {
                    if (xx[i] < offset)
                    {
                        xx.RemoveAt(i);
                        yy.RemoveAt(i);
                        i--;
                    }
                    else
                    {
                        break;
                    }
                }
            }

            List<PointF> points = new List<PointF>();

            for (int i = 0; i < dxList.Count; i++)
            {
                float image_x = ConvertXValueToRendererValue(surface,dxList[i]);
                float image_y = (float)Math.Min(ConvertYValueToRendererValue(surface, dyList[i]), surface.GetSize().Height - 2);

                PointF point = new PointF(image_x, image_y);
                points.Add(point);
            }

            return points;
        }

        /// <summary>
        /// Draws the specified data series points on the target surface.
        /// </summary>
        /// <param name="surface">The target graph surface.</param>
        /// <param name="series">The instance of the current rendered data series.</param>
        /// <param name="points">The collection of the current data series drawing points.</param>
        /// <param name="index">The index of the current data series within the collection of data series.</param>
        /// <param name="count">The length of the data series collection.</param>
        public override void Draw(IGraphSurface<TDataSeries> surface, TDataSeries series, IEnumerable<PointF> points, int index, int count)
        {
            if (series.UseFill)
            {
                surface.FillSeries(series, GetFillPoints(surface, points));
            }

            surface.DrawSeries(series, GetFillPoints(surface, points));
        }
    }
}