diff options
Diffstat (limited to 'Software/Visual_Studio/SideChains/RealTimeGraphX/Renderers/GraphScrollingRenderer.cs')
| -rw-r--r-- | Software/Visual_Studio/SideChains/RealTimeGraphX/Renderers/GraphScrollingRenderer.cs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/Software/Visual_Studio/SideChains/RealTimeGraphX/Renderers/GraphScrollingRenderer.cs b/Software/Visual_Studio/SideChains/RealTimeGraphX/Renderers/GraphScrollingRenderer.cs new file mode 100644 index 000000000..e3bf6182e --- /dev/null +++ b/Software/Visual_Studio/SideChains/RealTimeGraphX/Renderers/GraphScrollingRenderer.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RealTimeGraphX.Renderers +{ + /// <summary> + /// Represents a scrolling style graph renderer. + /// </summary> + /// <typeparam name="TDataSeries">The type of the graph data series.</typeparam> + /// <typeparam name="XDataPoint">The type of the x-axis data point.</typeparam> + /// <typeparam name="YDataPoint">The type of the y-axis data point.</typeparam> + /// <seealso cref="RealTimeGraphX.GraphRendererBase{XDataPoint, YDataPoint}" /> + public class GraphScrollingRenderer<TDataSeries, XDataPoint, YDataPoint> : GraphRendererBase<TDataSeries, XDataPoint, YDataPoint> where XDataPoint : GraphDataPointBase where YDataPoint : GraphDataPointBase where TDataSeries : IGraphDataSeries + { + /// <summary> + /// Returns an array of absolute graph data points to render. + /// This method is called per data series. + /// </summary> + /// <param name="seriesCollection">A collection of all data series that is currently in the rendering pass.</param> + /// <param name="series">The current data series to render.</param> + /// <param name="toRender">Pending data series object to render.</param> + /// <returns></returns> + protected override List<GraphPoint> OnRender(IEnumerable<PendingSeries> seriesCollection, TDataSeries series, PendingSeries toRender) + { + XDataPoint min_x = toRender.XX.First(); + XDataPoint max_x = toRender.XX.Last(); + + YDataPoint min_y = Input.Range.MinimumY; + YDataPoint max_y = Input.Range.MaximumY; + + if (Input.Range.AutoY) + { + min_y = _current_min_y; + max_y = _current_max_y; + } + + OnEffectiveRangeXChanged(min_x, max_x); + OnEffectiveRangeYChanged(min_y, max_y); + + var dxList = toRender.XX.Select(x => x.ComputeRelativePosition(min_x, max_x)).ToList(); + var dyList = toRender.YY.Select(x => x.ComputeRelativePosition(min_y, max_y)).ToList(); + + if (max_x - min_x > Input.Range.MaximumX) + { + var offset = ((max_x - min_x) - Input.Range.MaximumX) + min_x; + + for (int i = 0; i < toRender.XX.Count; i++) + { + if (toRender.XX[i] < offset) + { + toRender.XX.RemoveAt(i); + toRender.YY.RemoveAt(i); + i--; + } + else + { + break; + } + } + } + + List<GraphPoint> points = new List<GraphPoint>(); + + for (int i = 0; i < dxList.Count; i++) + { + float image_x = ConvertXValueToRendererValue(dxList[i]); + float image_y = (float)Math.Min(ConvertYValueToRendererValue(dyList[i]), Output.SurfaceHeight - 2); + + GraphPoint point = new GraphPoint(image_x, image_y); + points.Add(point); + } + + return points; + } + } +} |
