/// <summary> /// Renders a line chart a canvas. This method is called by the chart class. /// </summary> /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param> /// <param name="axis">Axis orientation object</param> /// <param name="minMax">Data for the extreme values</param> /// <param name="gridPaint">Paint object for the grid lines</param> public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { CheckConstructionPolicy(nameof(LineChart)); var canvas = canvasWrapper.Canvas; if (canvasWrapper.NumberPlottedChart < 1) { DrawHorizontalLabels(canvasWrapper, axis, minMax); DrawVerticalLabels(canvasWrapper, axis, minMax); } _chartPaint.IsStroke = true; var path = new SKPath(); path.MoveTo(ConstructionData.First()); foreach (var point in ConstructionData.Skip(1)) { path.LineTo(point); if (ShowPoints) { canvas.DrawCircle(point, PointRadius, _chartPaint); } } canvas.DrawPath(path, _chartPaint); canvasWrapper.NumberPlottedChart += 1; if (canvasWrapper.CanShowLegend) { RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.LineChart); } }
public void OutputBuilderTests_BuildProductLines_NullProductValue_ThrowsException() { //arrange var sut = new OutputBuilder(); IMinMax range = GetMinMaxMock(1, 5, 3); // Irrelevant to this test IAccumulatedProduct[] mockData = { GetAccumulatedProductMock("a", new double[0]), GetAccumulatedProductMock("b", null), GetAccumulatedProductMock("c", new double[0]), }; IAccumulatedProducts mockDatas = GetAccumulatedProductsMock(range, mockData); bool exceptionThrown = false; string exceptionMessage = ""; //act try { sut.BuildProductLines(mockDatas); } catch (InvalidOperationException e) { exceptionThrown = true; exceptionMessage = e.Message; } //assert Assert.IsTrue(exceptionThrown); Assert.AreEqual("Accumulated product 1 value: not allowed to be null", exceptionMessage); }
/// <summary> /// Renders a bar chart on the canvas. This method is called by the Chart class. /// </summary> /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param> /// <param name="axis">Axis orientation object</param> /// <param name="minMax">Data for the extreme values</param> /// <param name="gridPaint">Paint object for the grid lines</param> public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { CheckConstructionPolicy(nameof(BarChart)); var drawingSpace = canvasWrapper.ChartArea.Right / ConstructionData.Count() * 0.9; var rectSpace = (float)drawingSpace / canvasWrapper.NumberOfCharts; var columnSpace = (float)((canvasWrapper.ChartArea.Right / ConstructionData.Count()) - drawingSpace) / 2; var pointX = canvasWrapper.ChartArea.Width / ConstructionData.Count(); var counter = 0; foreach (var point in ConstructionData) { var x1 = (pointX * counter) + canvasWrapper.ChartArea.Left + columnSpace + (canvasWrapper.NumberPlottedChart * rectSpace); var x2 = x1 + rectSpace - columnSpace; var rect = new SKRect(x1, point.Y, x2, canvasWrapper.ChartArea.Top); _chartPaint.IsStroke = IsStroked; canvasWrapper.Canvas.DrawRect(rect, _chartPaint); var xLabel = XLabel[counter]; axis.DrawAndPositionXTickMark(xLabel, (x1 + (x2 - x1) / 2), canvasWrapper.ChartArea.Bottom, _labelPaint); var yLabel = GetYLabel(OriginalData.ElementAt(counter).Y); axis.DrawAndPositionYTickMark(yLabel, point.Y, (x1 + (x2 - x1) / 2), _labelPaint); counter++; } canvasWrapper.NumberPlottedChart += 1; }
/// <summary> /// Renders an Area chart a canvas. This method is called by the chart class. /// </summary> /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param> /// <param name="axis">Axis orientation object</param> /// <param name="minMax">Data for the extreme values</param> /// <param name="gridPaint">Paint object for the grid lines</param> public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { CheckConstructionPolicy(nameof(LineChart)); if (canvasWrapper.NumberPlottedChart < 1) { DrawHorizontalLabels(canvasWrapper, axis, minMax); DrawVerticalLabels(canvasWrapper, axis, minMax); } var canvas = canvasWrapper.Canvas; var path = new SKPath(); var constructionPoints = ConstructionData.ToList(); var firstPoint = ConstructionData.First(); var lastPoint = ConstructionData.Last(); var connectionPoint = new SKPoint(lastPoint.X, firstPoint.Y); constructionPoints.Add(connectionPoint); path.MoveTo(constructionPoints.First()); foreach (var point in constructionPoints.Skip(1)) { path.LineTo(point); } path.FillType = SKPathFillType.EvenOdd; path.Close(); _chartPaint.IsStroke = false; canvas.DrawPath(path, _chartPaint); canvasWrapper.NumberPlottedChart += 1; if (canvasWrapper.CanShowLegend) { RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.AreaChart); } }
private static IAccumulatedProducts GetAccumulatedProductsMock(IMinMax range, IEnumerable <IAccumulatedProduct> products) { var mockAccProducts = new Mock <IAccumulatedProducts>(); mockAccProducts.SetupGet(maps => maps.Range).Returns(range); mockAccProducts.SetupGet(maps => maps.Products).Returns(products); return(mockAccProducts.Object); }
public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { var divisor = 2.5f; var strokeWidth = 30; if (canvasWrapper.NumberOfCharts > 6) { switch (Device.RuntimePlatform) { case Device.WPF: case Device.GTK: case Device.macOS: case Device.UWP: { divisor = 2.0f; strokeWidth = 15; break; } default: { divisor = 1.5f; strokeWidth = 30; break; } } ; } var chartArea = canvasWrapper.ChartArea; var canvas = canvasWrapper.Canvas; var radius = Math.Min(chartArea.MidX, chartArea.MidY) / divisor; radius = radius - (canvasWrapper.NumberPlottedChart * strokeWidth); _chartPaint.StrokeWidth = strokeWidth; _chartPaint.Style = SKPaintStyle.Stroke; var teta = 360 - ((minMax.Ymax - OriginalData.ElementAt(0).Y) / (minMax.Ymax - minMax.Ymin) * 360); var rect = new SKRect(chartArea.MidX - radius, chartArea.MidY - radius, chartArea.MidX + radius, chartArea.MidY + radius); var path = new SKPath(); path.AddArc(rect, 90, -teta); canvas.DrawPath(path, _chartPaint); _chartPaint.Color = ChartColor.WithAlpha(70); canvas.DrawCircle(chartArea.MidX, chartArea.MidY, radius, _chartPaint); canvasWrapper.NumberPlottedChart += 1; _chartPaint.Color = ChartColor; ChartName = $"{Label} : {Value}"; RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.ScatterChart); }
private void Output(AccumulatedProducts accumulatedProducts, string fileName) { using (StreamWriter writer = new StreamWriter(fileName)) { IMinMax range = accumulatedProducts.Range; writer.WriteLine(range.Start + ", " + range.Duration); foreach (var product in accumulatedProducts.Products) { string toOutput = string.Join(", ", product.Values); string finalOutput = product.Name + ", " + toOutput; writer.WriteLine(finalOutput); } } }
//Draws the vertical labels protected void DrawVerticalLabels(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { var heightSpacing = (canvasWrapper.ChartArea.Bottom - canvasWrapper.ChartArea.Top) / canvasWrapper.GridLines; var heightHolder = heightSpacing; heightSpacing += canvasWrapper.Converter.YOffset; for (int i = 0; i < canvasWrapper.GridLines; i++) { var labelValue = canvasWrapper.Converter .YValueToRealScale(heightSpacing, minMax.Ymax, minMax.Ymin); axis.DrawAndPositionYTickMark(GetYLabel(labelValue), heightSpacing, canvasWrapper.ChartArea.Left, _labelPaint); heightSpacing += heightHolder; } }
//Draws the horizontal labels protected void DrawHorizontalLabels(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { var widthSpacing = (canvasWrapper.ChartArea.Right - canvasWrapper.ChartArea.Left) / canvasWrapper.GridLines; var widthHolder = widthSpacing; widthSpacing += canvasWrapper.Converter.XOffset; for (int i = 0; i < canvasWrapper.GridLines; i++) { var labelValue = canvasWrapper.Converter .XValueToRealScale(widthSpacing, minMax.Xmax, minMax.Xmin); axis.DrawAndPositionXTickMark(GetXLabel(labelValue), widthSpacing, canvasWrapper.ChartArea.Bottom, _labelPaint); widthSpacing += widthHolder; } }
public void OutputBuilderTests_BuildProductLines_CorrectProductName_StringStartsWithProductNameAndAComma() { //arrange var sut = new OutputBuilder(); IMinMax range = GetMinMaxMock(1, 5, 3); // Irrelevant to this test string names = "Working"; IAccumulatedProduct[] mockData = { GetAccumulatedProductMock(names, new double[0]) }; IAccumulatedProducts mockDatas = GetAccumulatedProductsMock(range, mockData); //act List <string> outputString = sut.BuildProductLines(mockDatas); //assert Assert.AreEqual("Working, ", outputString.First()); }
public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { int strokeWidth; float divisor; switch (Device.RuntimePlatform) { case Device.WPF: case Device.GTK: case Device.macOS: case Device.UWP: { divisor = 3.0f; strokeWidth = 100; break; } default: { divisor = 2.0f; strokeWidth = 200; break; } } ; var chartArea = canvasWrapper.ChartArea; var canvas = canvasWrapper.Canvas; _chartPaint.StrokeWidth = strokeWidth; _chartPaint.Style = SKPaintStyle.Stroke; _chartPaint.StrokeCap = SKStrokeCap.Butt; var radius = Math.Min(chartArea.MidX, chartArea.MidY) / divisor; var rect = new SKRect(chartArea.MidX - radius, chartArea.MidY - radius, chartArea.MidX + radius, chartArea.MidY + radius); var startAngle = canvasWrapper.NumberPlottedChart == 0 ? 0 : canvasWrapper.NextStartAngle; var sweepAngle = (Angel / canvasWrapper.SumOfAngles) * 360; var path = new SKPath(); path.AddArc(rect, -startAngle, -sweepAngle); canvas.DrawPath(path, _chartPaint); canvasWrapper.NextStartAngle = startAngle + sweepAngle; canvasWrapper.NumberPlottedChart += 1; ChartName = $"{Label} : {Value}"; RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.ScatterChart); }
/// <summary> /// Renders a bar chart on the canvas. This method is called by the Chart class. /// </summary> /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param> /// <param name="axis">Axis orientation object</param> /// <param name="minMax">Data for the extreme values</param> /// <param name="gridPaint">Paint object for the grid lines</param> public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { CheckConstructionPolicy(nameof(BarChart)); var count = ConstructionData.Count(); var drawingSpace = canvasWrapper.ChartArea.Right / count * 0.9; var rectSpace = (float)drawingSpace / canvasWrapper.NumberOfCharts; var columnSpace = (float)((canvasWrapper.ChartArea.Right / count) - drawingSpace) / 2; var pointX = canvasWrapper.ChartArea.Width / count; var counter = 0; foreach (var point in ConstructionData) { var x1 = (pointX * counter) + canvasWrapper.ChartArea.Left + columnSpace + (canvasWrapper.NumberPlottedChart * rectSpace); var x2 = x1 + rectSpace - columnSpace; var rect = new SKRect(x1, point.Y, x2, canvasWrapper.ChartArea.Top); _chartPaint.IsStroke = IsStroked; canvasWrapper.Canvas.DrawRect(rect, _chartPaint); var xLabel = XLabel[counter]; _labelPaint.TextSize = canvasWrapper.LabelTextSize; if (canvasWrapper.NumberPlottedChart == 0) { RenderXTickMark(canvasWrapper, axis, x1, x2, xLabel); var yLabel = GetYLabel(OriginalData.ElementAt(counter).Y); if (yLabel.Trim().Length > 5) { canvasWrapper.DrawYTickMarkOnBars = false; DrawVerticalLabels(canvasWrapper, axis, minMax); } } if (canvasWrapper.DrawYTickMarkOnBars) { RenderYTickMark(canvasWrapper, axis, counter, point, rect); } counter++; } canvasWrapper.NumberPlottedChart += 1; if (canvasWrapper.CanShowLegend) { RenderLegend(canvasWrapper, axis, canvasWrapper.Canvas, PointPlotVariant.AreaChart); } }
/// <summary> /// Renders a Scatter chart a canvas. This method is called by the chart class. /// </summary> /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param> /// <param name="axis">Axis orientation object</param> /// <param name="minMax">Data for the extreme values</param> /// <param name="gridPaint">Paint object for the grid lines</param> public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { CheckConstructionPolicy(nameof(ScatterChart)); if (canvasWrapper.NumberPlottedChart < 1) { DrawHorizontalLabels(canvasWrapper, axis, minMax); DrawVerticalLabels(canvasWrapper, axis, minMax); } var canvas = DisplayPoints(canvasWrapper); canvasWrapper.NumberPlottedChart += 1; if (canvasWrapper.CanShowLegend) { RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.ScatterChart); } }
/// <summary> /// Renders a line chart a canvas. This method is called by the chart class. /// </summary> /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param> /// <param name="axis">Axis orientation object</param> /// <param name="minMax">Data for the extreme values</param> /// <param name="gridPaint">Paint object for the grid lines</param> public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { CheckConstructionPolicy(nameof(LineChart)); var canvas = canvasWrapper.Canvas; if (canvasWrapper.NumberPlottedChart < 1) { DrawHorizontalLabels(canvasWrapper, axis, minMax); DrawVerticalLabels(canvasWrapper, axis, minMax); } _chartPaint.IsStroke = true; canvas.DrawPoints(SKPointMode.Lines, ConstructionData.ToArray(), _chartPaint); canvasWrapper.NumberPlottedChart += 1; if (canvasWrapper.CanShowLegend) { RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.LineChart); } }
public void OutputBuilderTests_BuildProductLines_IfNoDataIn_ThrowsException() { //arrange var sut = new OutputBuilder(); IMinMax range = GetMinMaxMock(1, 5, 3); // Irrelevant to this test IAccumulatedProducts mockDatas = GetAccumulatedProductsMock(range, new IAccumulatedProduct[] { }); bool exceptionThrown = false; string exceptionMessage = ""; //act try { sut.BuildProductLines(mockDatas); } catch (InvalidOperationException e) { exceptionThrown = true; exceptionMessage = e.Message; } //assert Assert.IsTrue(exceptionThrown); Assert.AreEqual("The list of accumulated products is not allowed to be empty", exceptionMessage); }
/// <summary> /// Renders a Scatter chart a canvas. This method is called by the chart class. /// </summary> /// <param name="canvasWrapper">wrapper class containing info mation about the canvas and chart</param> /// <param name="axis">Axis orientation object</param> /// <param name="minMax">Data for the extreme values</param> /// <param name="gridPaint">Paint object for the grid lines</param> public override void RenderChart(CanvasWrapper canvasWrapper, Axis axis, IMinMax minMax) { CheckConstructionPolicy(nameof(LineChart)); if (canvasWrapper.NumberPlottedChart < 1) { DrawHorizontalLabels(canvasWrapper, axis, minMax); DrawVerticalLabels(canvasWrapper, axis, minMax); } var canvas = canvasWrapper.Canvas; _chartPaint.IsStroke = IsStroked; foreach (var point in ConstructionData) { canvas.DrawCircle(point, PointRadius, _chartPaint); } canvasWrapper.NumberPlottedChart += 1; if (canvasWrapper.CanShowLegend) { RenderLegend(canvasWrapper, axis, canvas, PointPlotVariant.ScatterChart); } }
public MinMaxViewModel(IMinMax <T> limits) { Limits = limits; }
public string BuildSummaryLine(IMinMax range) { string summaryLine = range.Start + ", " + range.Duration; return(summaryLine); }
public override float InitialCalculations(IMinMax minMax) { Angel = 360 - ((minMax.Ymax - OriginalData.ElementAt(0).Y) / (minMax.Ymax - minMax.Ymin) * 360); return(Angel); }
//No initial Calculation for this chart type public virtual float InitialCalculations(IMinMax minMax) { return(0f); }