/// <summary> /// Get point for Radar /// </summary> /// <param name="circularPlotDetails"></param> /// <param name="plotGroup"></param> /// <param name="dp"></param> /// <param name="dataPointIndex"></param> /// <returns></returns> private static Point GetRadarPoint(CircularPlotDetails circularPlotDetails, PlotGroup plotGroup, DataPoint dp, Double dataPointIndex) { Double yValue; if (Double.IsNaN(dp.InternalYValue)) { yValue = 0; } else { yValue = dp.InternalYValue; } Double yPosition = Graphics.ValueToPixelPosition(circularPlotDetails.Radius, 0, plotGroup.AxisY.InternalAxisMinimum, plotGroup.AxisY.InternalAxisMaximum, yValue); Double radius = circularPlotDetails.Radius - yPosition; Double minAngle = circularPlotDetails.MinAngleInDegree * dataPointIndex; Double actualAngle = AxisLabel.GetRadians(minAngle) - (Math.PI / 2); Double x = radius * Math.Cos(actualAngle) + circularPlotDetails.Center.X; Double y = radius * Math.Sin(actualAngle) + circularPlotDetails.Center.Y; return(new Point(x, y)); }
/// <summary> /// Create Polar series /// </summary> /// <param name="chart"></param> /// <param name="series"></param> /// <param name="polarCanvas"></param> /// <param name="labelCanvas"></param> /// <param name="width"></param> /// <param name="height"></param> /// <param name="plotGroup"></param> /// <param name="circularPlotDetails"></param> private static void CreatePolarSeries(Chart chart, DataSeries series, Canvas polarCanvas, Canvas labelCanvas, Double width, Double height, PlotGroup plotGroup, CircularPlotDetails circularPlotDetails) { List<List<DataPoint>> brokenLineDataPointsGroup = GetBrokenLineDataPointsGroup(series, circularPlotDetails, plotGroup); foreach (List<DataPoint> dataPointList in brokenLineDataPointsGroup) { foreach (DataPoint dataPoint in dataPointList) DrawMarker(dataPoint, labelCanvas, width, height, circularPlotDetails.Center); DrawDataSeriesPath(series, dataPointList, polarCanvas); } }
/// <summary> /// Get point for Polar /// </summary> /// <param name="circularPlotDetails"></param> /// <param name="plotGroup"></param> /// <param name="dp"></param> /// <returns></returns> private static Point GetPolarPoint(CircularPlotDetails circularPlotDetails, PlotGroup plotGroup, DataPoint dp) { Double yValue = dp.InternalYValue; Double yPosition = Graphics.ValueToPixelPosition(circularPlotDetails.Radius, 0, plotGroup.AxisY.InternalAxisMinimum, plotGroup.AxisY.InternalAxisMaximum, yValue); Double radius = circularPlotDetails.Radius - yPosition; Axis axisX = plotGroup.AxisX; Double minValInRadian; if (axisX.InternalAxisMinimum != 0) { minValInRadian = AxisLabel.GetRadians(axisX.InternalAxisMinimum - 90); } else { minValInRadian = 2 * Math.PI - Math.PI / 2; } Double actualAngle; if (dp.Parent.XValueType == ChartValueTypes.Time) { actualAngle = Graphics.ValueToPixelPosition(minValInRadian, 2 * Math.PI + minValInRadian, AxisLabel.GetRadians(0), AxisLabel.GetRadians(360), AxisLabel.GetRadians(dp.InternalXValue)); } else { actualAngle = Graphics.ValueToPixelPosition(minValInRadian, 2 * Math.PI + minValInRadian, AxisLabel.GetRadians(axisX.InternalAxisMinimum), AxisLabel.GetRadians(axisX.InternalAxisMaximum), AxisLabel.GetRadians(axisX.InternalAxisMinimum + dp.InternalXValue)); } Double x = radius * Math.Cos(actualAngle) + circularPlotDetails.Center.X; Double y = radius * Math.Sin(actualAngle) + circularPlotDetails.Center.Y; return(new Point(x, y)); }
/// <summary> /// Get point for Polar /// </summary> /// <param name="circularPlotDetails"></param> /// <param name="plotGroup"></param> /// <param name="dp"></param> /// <returns></returns> private static Point GetPolarPoint(CircularPlotDetails circularPlotDetails, PlotGroup plotGroup, DataPoint dp) { Double yValue = dp.InternalYValue; Double yPosition = Graphics.ValueToPixelPosition(circularPlotDetails.Radius, 0, plotGroup.AxisY.InternalAxisMinimum, plotGroup.AxisY.InternalAxisMaximum, yValue); Double radius = circularPlotDetails.Radius - yPosition; Axis axisX = plotGroup.AxisX; Double minValInRadian; if (axisX.InternalAxisMinimum != 0) minValInRadian = AxisLabel.GetRadians(axisX.InternalAxisMinimum - 90); else minValInRadian = 2 * Math.PI - Math.PI / 2; Double actualAngle; if(dp.Parent.XValueType == ChartValueTypes.Time) actualAngle = Graphics.ValueToPixelPosition(minValInRadian, 2 * Math.PI + minValInRadian, AxisLabel.GetRadians(0), AxisLabel.GetRadians(360), AxisLabel.GetRadians(dp.InternalXValue)); else actualAngle = Graphics.ValueToPixelPosition(minValInRadian, 2 * Math.PI + minValInRadian, AxisLabel.GetRadians(axisX.InternalAxisMinimum), AxisLabel.GetRadians(axisX.InternalAxisMaximum), AxisLabel.GetRadians(axisX.InternalAxisMinimum + dp.InternalXValue)); Double x = radius * Math.Cos(actualAngle) + circularPlotDetails.Center.X; Double y = radius * Math.Sin(actualAngle) + circularPlotDetails.Center.Y; return new Point(x, y); }
/// <summary> /// Get visual for DataSeries /// </summary> /// <param name="chart">Chart</param> /// <param name="width">Width</param> /// <param name="height">Height</param> /// <param name="series">DataSeries</param> /// <param name="circularPlotDetails">CircularPlotDetails</param> /// <returns>Canvas</returns> private static Canvas GetDataSeriesVisual(Chart chart, Double width, Double height, DataSeries series, CircularPlotDetails circularPlotDetails) { Canvas visual = new Canvas(); Canvas polarCanvas = new Canvas(); Canvas labelCanvas = new Canvas(); if ((Boolean)series.Enabled) { PlotGroup plotGroup = series.PlotGroup; if (circularPlotDetails.ListOfPoints4CircularAxis.Count > 0) { series.Faces = new Faces(); CreatePolarSeries(chart, series, polarCanvas, labelCanvas, width, height, plotGroup, circularPlotDetails); } } // Apply animation for DataSeries if (chart._internalAnimationEnabled) { if (series.Storyboard == null) series.Storyboard = new Storyboard(); // Apply animation to radar visual series.Storyboard = AnimationHelper.ApplyOpacityAnimation(polarCanvas, series, series.Storyboard, 1, 1, 0, 1); // Apply animation to the marker and labels series.Storyboard = AnimationHelper.ApplyOpacityAnimation(labelCanvas, series, series.Storyboard, 1.5, 1, 0, 1); } visual.Children.Add(polarCanvas); visual.Children.Add(labelCanvas); return visual; }
/// <summary> /// Create Polar series /// </summary> /// <param name="chart"></param> /// <param name="series"></param> /// <param name="polarCanvas"></param> /// <param name="labelCanvas"></param> /// <param name="width"></param> /// <param name="height"></param> /// <param name="plotGroup"></param> /// <param name="circularPlotDetails"></param> private static void CreatePolarSeries(Chart chart, DataSeries series, Canvas polarCanvas, Canvas labelCanvas, Double width, Double height, PlotGroup plotGroup, CircularPlotDetails circularPlotDetails) { List <List <DataPoint> > brokenLineDataPointsGroup = GetBrokenLineDataPointsGroup(series, circularPlotDetails, plotGroup); foreach (List <DataPoint> dataPointList in brokenLineDataPointsGroup) { foreach (DataPoint dataPoint in dataPointList) { DrawMarker(dataPoint, labelCanvas, width, height, circularPlotDetails.Center); } DrawDataSeriesPath(series, dataPointList, polarCanvas); } }
/// <summary> /// Get visual for DataSeries /// </summary> /// <param name="chart">Chart</param> /// <param name="width">Width</param> /// <param name="height">Height</param> /// <param name="series">DataSeries</param> /// <param name="circularPlotDetails">CircularPlotDetails</param> /// <returns>Canvas</returns> private static Canvas GetDataSeriesVisual(Chart chart, Double width, Double height, DataSeries series, CircularPlotDetails circularPlotDetails) { Canvas visual = new Canvas(); Canvas polarCanvas = new Canvas(); Canvas labelCanvas = new Canvas(); if ((Boolean)series.Enabled) { PlotGroup plotGroup = series.PlotGroup; if (circularPlotDetails.ListOfPoints4CircularAxis.Count > 0) { series.Faces = new Faces(); CreatePolarSeries(chart, series, polarCanvas, labelCanvas, width, height, plotGroup, circularPlotDetails); } } // Apply animation for DataSeries if (chart._internalAnimationEnabled) { if (series.Storyboard == null) { series.Storyboard = new Storyboard(); } // Apply animation to radar visual series.Storyboard = AnimationHelper.ApplyOpacityAnimation(polarCanvas, series, series.Storyboard, 1, 1, 0, 1); // Apply animation to the marker and labels series.Storyboard = AnimationHelper.ApplyOpacityAnimation(labelCanvas, series, series.Storyboard, 1.5, 1, 0, 1); } visual.Children.Add(polarCanvas); visual.Children.Add(labelCanvas); return(visual); }
/// <summary> /// Create and position Axes for Circular chart /// </summary> /// <param name="visual"></param> /// <param name="width"></param> /// <param name="height"></param> /// <param name="plotDetails"></param> /// <param name="circularPlotDetails"></param> private void CreateAndPositionAxes4CircularChart(Canvas visual, Double width, Double height, PlotDetails plotDetails, CircularPlotDetails circularPlotDetails) { if (AxisX != null) { CreateAxis4CircularChart(AxisX, width, height, plotDetails, circularPlotDetails); if (AxisX.CircularAxisVisual != null) visual.Children.Add(AxisX.CircularAxisVisual); } if (AxisY != null) { CreateAxis4CircularChart(AxisY, width, height, plotDetails, circularPlotDetails); if (AxisY.CircularAxisVisual != null) visual.Children.Add(AxisY.CircularAxisVisual); } }
/// <summary> /// Calculate radar points /// </summary> /// <param name="series"></param> /// <param name="listOfRadarPoints"></param> /// <param name="plotGroup"></param> /// <param name="circularPlotDetails"></param> private static void CalculateRadarPoints(DataSeries series, ref List<Point> listOfRadarPoints, PlotGroup plotGroup, CircularPlotDetails circularPlotDetails) { DataPoint currDataPoint; DataPoint nextDataPoint; DataPoint preDataPoint = null; DataPoint firstDataPoint = series.InternalDataPoints[0]; DataPoint lastDataPoint = series.InternalDataPoints[series.InternalDataPoints.Count - 1]; for (Int32 i = 0; i < series.InternalDataPoints.Count - 1; i++) { currDataPoint = series.InternalDataPoints[i]; Double dataPointIndex = series.InternalDataPoints.IndexOf(currDataPoint); if (!(Boolean)currDataPoint.Enabled) continue; nextDataPoint = series.InternalDataPoints[i + 1]; Point dataPointPosition = GetRadarPoint(circularPlotDetails, plotGroup, currDataPoint, dataPointIndex); if (!Double.IsNaN(currDataPoint.InternalYValue) && (currDataPoint.InternalYValue > plotGroup.AxisY.InternalAxisMaximum || currDataPoint.InternalYValue < plotGroup.AxisY.InternalAxisMinimum)) { currDataPoint._visualPosition = new Point(Double.NaN, Double.NaN); listOfRadarPoints.Add(new Point(circularPlotDetails.Center.X, circularPlotDetails.Center.Y)); } else if (currDataPoint == firstDataPoint && (nextDataPoint != null && Double.IsNaN(nextDataPoint.InternalYValue)) && (lastDataPoint != null && !Double.IsNaN(lastDataPoint.InternalYValue))) { listOfRadarPoints.Add(dataPointPosition); currDataPoint._visualPosition = dataPointPosition; } else if (!Double.IsNaN(currDataPoint.InternalYValue) && ((preDataPoint != null && !Double.IsNaN(preDataPoint.InternalYValue)) || (nextDataPoint != null && !Double.IsNaN(nextDataPoint.InternalYValue)))) { listOfRadarPoints.Add(dataPointPosition); currDataPoint._visualPosition = dataPointPosition; } else { currDataPoint._visualPosition = new Point(Double.NaN, Double.NaN); listOfRadarPoints.Add(new Point(circularPlotDetails.Center.X, circularPlotDetails.Center.Y)); } preDataPoint = series.InternalDataPoints[i]; if (i == series.InternalDataPoints.Count - 2) // If next DataPoint is the last DataPoint { dataPointIndex = series.InternalDataPoints.IndexOf(nextDataPoint); dataPointPosition = GetRadarPoint(circularPlotDetails, plotGroup, nextDataPoint, dataPointIndex); if (!Double.IsNaN(nextDataPoint.InternalYValue) && (nextDataPoint.InternalYValue > plotGroup.AxisY.InternalAxisMaximum || nextDataPoint.InternalYValue < plotGroup.AxisY.InternalAxisMinimum)) { nextDataPoint._visualPosition = new Point(Double.NaN, Double.NaN); listOfRadarPoints.Add(new Point(circularPlotDetails.Center.X, circularPlotDetails.Center.Y)); } else if (!Double.IsNaN(nextDataPoint.InternalYValue) && (preDataPoint != null && !Double.IsNaN(preDataPoint.InternalYValue)) || (lastDataPoint != null && !Double.IsNaN(lastDataPoint.InternalYValue))) { listOfRadarPoints.Add(dataPointPosition); nextDataPoint._visualPosition = dataPointPosition; } else { nextDataPoint._visualPosition = new Point(Double.NaN, Double.NaN); listOfRadarPoints.Add(new Point(circularPlotDetails.Center.X, circularPlotDetails.Center.Y)); } if (series.InternalDataPoints.Count < circularPlotDetails.ListOfPoints4CircularAxis.Count) listOfRadarPoints.Add(new Point(circularPlotDetails.Center.X, circularPlotDetails.Center.Y)); } } }
/// <summary> /// Get point for Radar /// </summary> /// <param name="circularPlotDetails"></param> /// <param name="plotGroup"></param> /// <param name="dp"></param> /// <param name="dataPointIndex"></param> /// <returns></returns> private static Point GetRadarPoint(CircularPlotDetails circularPlotDetails, PlotGroup plotGroup, DataPoint dp, Double dataPointIndex) { Double yValue; if (Double.IsNaN(dp.InternalYValue)) yValue = 0; else yValue = dp.InternalYValue; Double yPosition = Graphics.ValueToPixelPosition(circularPlotDetails.Radius, 0, plotGroup.AxisY.InternalAxisMinimum, plotGroup.AxisY.InternalAxisMaximum, yValue); Double radius = circularPlotDetails.Radius - yPosition; Double minAngle = circularPlotDetails.MinAngleInDegree * dataPointIndex; Double actualAngle = AxisLabel.GetRadians(minAngle) - (Math.PI / 2); Double x = radius * Math.Cos(actualAngle) + circularPlotDetails.Center.X; Double y = radius * Math.Sin(actualAngle) + circularPlotDetails.Center.Y; return new Point(x, y); }
/// <summary> /// Get visual for DataSeries /// </summary> /// <param name="chart">Chart</param> /// <param name="width">Width</param> /// <param name="height">Height</param> /// <param name="series">DataSeries</param> /// <param name="circularPlotDetails">CircularPlotDetails</param> /// <returns>Canvas</returns> private static Canvas GetDataSeriesVisual(Chart chart, Double width, Double height, DataSeries series, CircularPlotDetails circularPlotDetails) { Canvas visual = new Canvas(); Canvas radarCanvas = new Canvas(); Canvas labelCanvas = new Canvas(); if ((Boolean)series.Enabled) { PlotGroup plotGroup = series.PlotGroup; List<Point> listOfRadarPoints = new List<Point>(); series.Faces = new Faces(); CalculateRadarPoints(series, ref listOfRadarPoints, plotGroup, circularPlotDetails); DrawMarkers(series, labelCanvas, chart, width, height, circularPlotDetails.Center); DrawDataSeriesPolygon(listOfRadarPoints, series, radarCanvas); } // Apply animation for DataSeries if (chart._internalAnimationEnabled) { if (series.Storyboard == null) series.Storyboard = new Storyboard(); // Apply animation to radar visual series.Storyboard = AnimationHelper.ApplyOpacityAnimation(radarCanvas, series, series.Storyboard, 1, 1, 0, 1); // Apply animation to the marker and labels series.Storyboard = AnimationHelper.ApplyOpacityAnimation(labelCanvas, series, series.Storyboard, 1.5, 1, 0, 1); } visual.Children.Add(radarCanvas); visual.Children.Add(labelCanvas); return visual; }
/// <summary> /// Calculate radar points /// </summary> /// <param name="series"></param> /// <param name="listOfRadarPoints"></param> /// <param name="plotGroup"></param> /// <param name="circularPlotDetails"></param> private static void CalculateRadarPoints(DataSeries series, ref List <Point> listOfRadarPoints, PlotGroup plotGroup, CircularPlotDetails circularPlotDetails) { DataPoint currDataPoint; DataPoint nextDataPoint; DataPoint preDataPoint = null; DataPoint firstDataPoint = series.InternalDataPoints[0]; DataPoint lastDataPoint = series.InternalDataPoints[series.InternalDataPoints.Count - 1]; for (Int32 i = 0; i < series.InternalDataPoints.Count - 1; i++) { currDataPoint = series.InternalDataPoints[i]; Double dataPointIndex = series.InternalDataPoints.IndexOf(currDataPoint); if (!(Boolean)currDataPoint.Enabled) { continue; } nextDataPoint = series.InternalDataPoints[i + 1]; Point dataPointPosition = GetRadarPoint(circularPlotDetails, plotGroup, currDataPoint, dataPointIndex); if (!Double.IsNaN(currDataPoint.InternalYValue) && (currDataPoint.InternalYValue > plotGroup.AxisY.InternalAxisMaximum || currDataPoint.InternalYValue < plotGroup.AxisY.InternalAxisMinimum)) { currDataPoint._visualPosition = new Point(Double.NaN, Double.NaN); listOfRadarPoints.Add(new Point(circularPlotDetails.Center.X, circularPlotDetails.Center.Y)); } else if (currDataPoint == firstDataPoint && (nextDataPoint != null && Double.IsNaN(nextDataPoint.InternalYValue)) && (lastDataPoint != null && !Double.IsNaN(lastDataPoint.InternalYValue))) { listOfRadarPoints.Add(dataPointPosition); currDataPoint._visualPosition = dataPointPosition; } else if (!Double.IsNaN(currDataPoint.InternalYValue) && ((preDataPoint != null && !Double.IsNaN(preDataPoint.InternalYValue)) || (nextDataPoint != null && !Double.IsNaN(nextDataPoint.InternalYValue)))) { listOfRadarPoints.Add(dataPointPosition); currDataPoint._visualPosition = dataPointPosition; } else { currDataPoint._visualPosition = new Point(Double.NaN, Double.NaN); listOfRadarPoints.Add(new Point(circularPlotDetails.Center.X, circularPlotDetails.Center.Y)); } preDataPoint = series.InternalDataPoints[i]; if (i == series.InternalDataPoints.Count - 2) // If next DataPoint is the last DataPoint { dataPointIndex = series.InternalDataPoints.IndexOf(nextDataPoint); dataPointPosition = GetRadarPoint(circularPlotDetails, plotGroup, nextDataPoint, dataPointIndex); if (!Double.IsNaN(nextDataPoint.InternalYValue) && (nextDataPoint.InternalYValue > plotGroup.AxisY.InternalAxisMaximum || nextDataPoint.InternalYValue < plotGroup.AxisY.InternalAxisMinimum)) { nextDataPoint._visualPosition = new Point(Double.NaN, Double.NaN); listOfRadarPoints.Add(new Point(circularPlotDetails.Center.X, circularPlotDetails.Center.Y)); } else if (!Double.IsNaN(nextDataPoint.InternalYValue) && (preDataPoint != null && !Double.IsNaN(preDataPoint.InternalYValue)) || (lastDataPoint != null && !Double.IsNaN(lastDataPoint.InternalYValue))) { listOfRadarPoints.Add(dataPointPosition); nextDataPoint._visualPosition = dataPointPosition; } else { nextDataPoint._visualPosition = new Point(Double.NaN, Double.NaN); listOfRadarPoints.Add(new Point(circularPlotDetails.Center.X, circularPlotDetails.Center.Y)); } if (series.InternalDataPoints.Count < circularPlotDetails.ListOfPoints4CircularAxis.Count) { listOfRadarPoints.Add(new Point(circularPlotDetails.Center.X, circularPlotDetails.Center.Y)); } } } }
/// <summary> /// Get visual for DataSeries /// </summary> /// <param name="chart">Chart</param> /// <param name="width">Width</param> /// <param name="height">Height</param> /// <param name="series">DataSeries</param> /// <param name="circularPlotDetails">CircularPlotDetails</param> /// <returns>Canvas</returns> private static Canvas GetDataSeriesVisual(Chart chart, Double width, Double height, DataSeries series, CircularPlotDetails circularPlotDetails) { Canvas visual = new Canvas(); Canvas radarCanvas = new Canvas(); Canvas labelCanvas = new Canvas(); if ((Boolean)series.Enabled) { PlotGroup plotGroup = series.PlotGroup; List <Point> listOfRadarPoints = new List <Point>(); series.Faces = new Faces(); CalculateRadarPoints(series, ref listOfRadarPoints, plotGroup, circularPlotDetails); DrawMarkers(series, labelCanvas, chart, width, height, circularPlotDetails.Center); DrawDataSeriesPolygon(listOfRadarPoints, series, radarCanvas); } // Apply animation for DataSeries if (chart._internalAnimationEnabled) { if (series.Storyboard == null) { series.Storyboard = new Storyboard(); } // Apply animation to radar visual series.Storyboard = AnimationHelper.ApplyOpacityAnimation(radarCanvas, series, series.Storyboard, 1, 1, 0, 1); // Apply animation to the marker and labels series.Storyboard = AnimationHelper.ApplyOpacityAnimation(labelCanvas, series, series.Storyboard, 1.5, 1, 0, 1); } visual.Children.Add(radarCanvas); visual.Children.Add(labelCanvas); return(visual); }
/// <summary> /// Get AxisY for Circular chart /// </summary> /// <param name="width"></param> /// <param name="height"></param> /// <param name="plotDetails"></param> /// <param name="circularPlotDetails"></param> /// <returns></returns> private Canvas CreateAxis4CircularChart(Axis axis, Double width, Double height, PlotDetails plotDetails, CircularPlotDetails circularPlotDetails) { Chart chart = plotDetails.Chart; if (axis != null && plotDetails.ChartOrientation == ChartOrientationType.Circular) { axis.Width = width; axis.Height = height; axis.CircularPlotDetails = circularPlotDetails; axis.CreateVisualObject(chart); return axis.CircularAxisVisual; } return null; }
/// <summary> /// Get broken list of polar DataPoints collection /// </summary> /// <param name="dataSeries"></param> /// <param name="circularPlotDetails"></param> /// <param name="plotGroup"></param> /// <returns></returns> private static List<List<DataPoint>> GetBrokenLineDataPointsGroup(DataSeries dataSeries, CircularPlotDetails circularPlotDetails, PlotGroup plotGroup) { Boolean IsStartPoint = true; Double xPosition; Double yPosition; Point endPoint = new Point(); List<List<DataPoint>> brokenLineDataPointsCollection = new List<List<DataPoint>>(); List<DataPoint> pointsList4EachBrokenLineGroup = new List<DataPoint>(); foreach (DataPoint dataPoint in dataSeries.InternalDataPoints) { if (dataPoint.Enabled == false) continue; if (Double.IsNaN(dataPoint.InternalYValue) || ((dataPoint.InternalYValue > plotGroup.AxisY.InternalAxisMaximum) || (dataPoint.InternalYValue < plotGroup.AxisY.InternalAxisMinimum))) { xPosition = Double.NaN; yPosition = Double.NaN; IsStartPoint = true; } else { Point point = GetPolarPoint(circularPlotDetails, plotGroup, dataPoint); xPosition = point.X; yPosition = point.Y; #region Generate GeometryGroup for line if (IsStartPoint) { IsStartPoint = !IsStartPoint; if (pointsList4EachBrokenLineGroup.Count > 0) { brokenLineDataPointsCollection.Add(pointsList4EachBrokenLineGroup); } pointsList4EachBrokenLineGroup = new List<DataPoint>(); } else { endPoint = new Point(xPosition, yPosition); IsStartPoint = false; } #endregion Generate GeometryGroup for line and line shadow dataPoint._visualPosition = new Point(xPosition, yPosition); pointsList4EachBrokenLineGroup.Add(dataPoint); } } brokenLineDataPointsCollection.Add(pointsList4EachBrokenLineGroup); return brokenLineDataPointsCollection; }
/// <summary> /// Get broken list of polar DataPoints collection /// </summary> /// <param name="dataSeries"></param> /// <param name="circularPlotDetails"></param> /// <param name="plotGroup"></param> /// <returns></returns> private static List <List <DataPoint> > GetBrokenLineDataPointsGroup(DataSeries dataSeries, CircularPlotDetails circularPlotDetails, PlotGroup plotGroup) { Boolean IsStartPoint = true; Double xPosition; Double yPosition; Point endPoint = new Point(); List <List <DataPoint> > brokenLineDataPointsCollection = new List <List <DataPoint> >(); List <DataPoint> pointsList4EachBrokenLineGroup = new List <DataPoint>(); foreach (DataPoint dataPoint in dataSeries.InternalDataPoints) { if (dataPoint.Enabled == false) { continue; } if (Double.IsNaN(dataPoint.InternalYValue) || ((dataPoint.InternalYValue > plotGroup.AxisY.InternalAxisMaximum) || (dataPoint.InternalYValue < plotGroup.AxisY.InternalAxisMinimum))) { xPosition = Double.NaN; yPosition = Double.NaN; IsStartPoint = true; } else { Point point = GetPolarPoint(circularPlotDetails, plotGroup, dataPoint); xPosition = point.X; yPosition = point.Y; #region Generate GeometryGroup for line if (IsStartPoint) { IsStartPoint = !IsStartPoint; if (pointsList4EachBrokenLineGroup.Count > 0) { brokenLineDataPointsCollection.Add(pointsList4EachBrokenLineGroup); } pointsList4EachBrokenLineGroup = new List <DataPoint>(); } else { endPoint = new Point(xPosition, yPosition); IsStartPoint = false; } #endregion Generate GeometryGroup for line and line shadow dataPoint._visualPosition = new Point(xPosition, yPosition); pointsList4EachBrokenLineGroup.Add(dataPoint); } } brokenLineDataPointsCollection.Add(pointsList4EachBrokenLineGroup); return(brokenLineDataPointsCollection); }
/// <summary> /// Create and position ChartGrid for circular chart /// </summary> internal void CreateAndPositionChartGrid4CircularAxesY() { Double interval = (Double)Interval; // Interval for the chart grid Decimal index = 0; // starting point for the loop that generates grids Decimal minVal = (Decimal)Minimum; // smallest value from where the grid must be drawn Decimal maxVal = (Decimal)Maximum; // largest value from where the grid must be drawn // gap between two intervals Decimal gap = (Decimal)interval; Int32 countRectangles = 0; // counts the number of color bands for animating them alternately in opposite direction Double position = 0; // value of the line position for the running loop cycle InterlacedPaths = new List <Path>(); InterlacedLines = new List <Line>(); List <Point> previousPoints = new List <Point>(); List <Point> currPoints = new List <Point>(); CircularPlotDetails plotDetails = ParentAxis.CircularPlotDetails; if (minVal != maxVal) { Decimal xValue; for (xValue = minVal; xValue <= maxVal;) { position = Graphics.ValueToPixelPosition(Height, 0, Minimum, Maximum, (Double)xValue); Double radius = Height - position; List <Point> points; if (plotDetails.CircularChartType == RenderAs.Radar) { points = GetGridPoints4Radar(radius, plotDetails.Center, plotDetails.ListOfPoints4CircularAxis.Count); } else { points = GetGridPoints4Polar(radius, plotDetails.Center, plotDetails.AnglesInRadian); } currPoints = points; Int32 i; for (i = 0; i < points.Count - 1; i++) { Line line = new Line(); InterlacedLines.Add(line); line.Stroke = LineColor; line.StrokeThickness = (Double)LineThickness; line.StrokeDashArray = ExtendedGraphics.GetDashArray(LineStyle); line.X1 = points[i].X; line.X2 = points[i + 1].X; line.Y1 = points[i].Y; line.Y2 = points[i + 1].Y; Visual.Children.Add(line); } // Create last line Line lastLine = new Line(); InterlacedLines.Add(lastLine); lastLine.Stroke = LineColor; lastLine.StrokeThickness = (Double)LineThickness; lastLine.StrokeDashArray = ExtendedGraphics.GetDashArray(LineStyle); lastLine.X1 = points[i].X; lastLine.X2 = points[0].X; lastLine.Y1 = points[i].Y; lastLine.Y2 = points[0].Y; Visual.Children.Add(lastLine); if (index % 2 == 1) { Path path = new Path(); path.StrokeThickness = 0; List <Point> listOfPreAndCurrPoints = new List <Point>(); for (Int32 newPointIndex = 0; newPointIndex < currPoints.Count; newPointIndex++) { listOfPreAndCurrPoints.Add(currPoints[newPointIndex]); } listOfPreAndCurrPoints.Add(currPoints[0]); for (Int32 prePointIndex = 0; prePointIndex < previousPoints.Count; prePointIndex++) { listOfPreAndCurrPoints.Add(previousPoints[prePointIndex]); } listOfPreAndCurrPoints.Add(previousPoints[0]); listOfPreAndCurrPoints.Add(currPoints[0]); path.Data = ParentAxis.GetPathGeometry(listOfPreAndCurrPoints); countRectangles++; path.Fill = InterlacedColor; path.SetValue(Canvas.ZIndexProperty, 10); Visual.Children.Add(path); InterlacedPaths.Add(path); } previousPoints = currPoints; index += (ParentAxis.SkipOffset + 1); xValue = minVal + index * gap; } } }
/// <summary> /// Render Axes for Circular chart /// </summary> private void RenderAxes4CircularChart() { // Create Axes for Circular chart if (Chart.PlotDetails.ChartOrientation == ChartOrientationType.Circular) { if (Chart.InternalSeries.Count > 0) { DataSeries ds = Chart.InternalSeries[0]; CircularPlotDetails circularPlotDetails = new CircularPlotDetails(Chart.PlotDetails.ChartOrientation, ds.RenderAs); Canvas visual = new Canvas(); CreateAndPositionAxes4CircularChart(visual, ChartVisualCanvas.Width, ChartVisualCanvas.Height, Chart.PlotDetails, circularPlotDetails); ChartVisualCanvas.Children.Add(visual); } } }