コード例 #1
0
ファイル: RadarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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));
        }
コード例 #2
0
ファイル: PolarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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);
            }
        }
コード例 #3
0
ファイル: PolarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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));
        }
コード例 #4
0
ファイル: PolarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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);
        }
コード例 #5
0
ファイル: PolarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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;
        }
コード例 #6
0
ファイル: PolarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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);
            }
        }
コード例 #7
0
ファイル: PolarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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);
        }
コード例 #8
0
ファイル: ChartArea.cs プロジェクト: zhangzy0193/visifire
        /// <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);
            }
        }
コード例 #9
0
ファイル: RadarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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));
                }
            }
        }
コード例 #10
0
ファイル: RadarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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);
        }
コード例 #11
0
ファイル: RadarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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;
        }
コード例 #12
0
ファイル: RadarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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));
                    }
                }
            }
        }
コード例 #13
0
ファイル: RadarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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);
        }
コード例 #14
0
ファイル: ChartArea.cs プロジェクト: zhangzy0193/visifire
        /// <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;
        }
コード例 #15
0
ファイル: PolarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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;
        }
コード例 #16
0
ファイル: PolarChart.cs プロジェクト: zhangzy0193/visifire
        /// <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);
        }
コード例 #17
0
        /// <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;
                }
            }
        }
コード例 #18
0
ファイル: ChartArea.cs プロジェクト: zhangzy0193/visifire
        /// <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);
                }
            }
        }