当前位置:首页 > Windows程序 > 正文

WPF实现的简单饼图

2021-03-26 Windows程序

namespace PieChartTest { using System.Collections.Generic; using System.Windows; using System.Windows.Media; using System.Windows.Shapes; /// <summary> /// 饼图的绘制类 /// </summary> public static class PieChartDrawer { /// <summary> /// 获取饼图的形状列表 /// </summary> /// <param>圆心</param> /// <param>圆的半径</param> /// <param>偏移角度,即第一个扇形开始的角度</param> /// <param>扇形列表,扇形列表的SpanAngle之和应为360度</param> /// <param>环列表</param> /// <returns>构成饼图的形状列表</returns> public static IEnumerable<Shape> GetPieChartShapes(Point center, double radius, double offsetAngle, IEnumerable<SectorPart> sectorParts, IEnumerable<RingPart> ringParts) { return GetEllipsePieChartShapes(center, radius, radius, offsetAngle, sectorParts, ringParts); } /// <summary> /// 获取椭圆形状的饼图的形状列表 /// </summary> /// <param>椭圆两个焦点的中点</param> /// <param>椭圆的长轴</param> /// <param>椭圆的短轴</param> /// <param>偏移角度,即第一个扇形开始的角度</param> /// <param>扇形列表,扇形列表的SpanAngle之和应为360度</param> /// <param>环列表</param> /// <returns>构成饼图的形状列表</returns> public static IEnumerable<Shape> GetEllipsePieChartShapes(Point center, double radiusX, double radiusY, double offsetAngle, IEnumerable<SectorPart> sectorParts, IEnumerable<RingPart> ringParts) { var shapes = new List<Shape>(); double startAngle = offsetAngle; foreach (var sectorPart in sectorParts) { // 扇形顺时针方向在椭圆上的第一个点 var firstPoint = center.GetEllipsePoint(radiusX, radiusY, startAngle); startAngle += sectorPart.SpanAngle; // 扇形顺时针方向在椭圆上的第二个点 var secondPoint = center.GetEllipsePoint(radiusX, radiusY, startAngle); var sectorFigure = new PathFigure { StartPoint = center }; // 添加中点到第一个点的弦 sectorFigure.Segments.Add(new LineSegment(firstPoint, false)); // 添加第一个点和第二个点之间的弧 sectorFigure.Segments.Add( new ArcSegment(secondPoint, new Size(radiusX, radiusY), 0, false, SweepDirection.Clockwise, false)); var sectorGeometry = new PathGeometry(); sectorGeometry.Figures.Add(sectorFigure); var sectorPath = new Path { Data = sectorGeometry, Fill = sectorPart.FillBrush }; shapes.Add(sectorPath); } var ringShapes = GetRingShapes(center, ringParts); shapes.AddRange(ringShapes); return shapes; } /// <summary> /// 获取环的形状列表 /// </summary> /// <param>中心点,,为圆表示圆形,为椭圆表示椭圆两个焦点的中点</param> /// <param>环列表</param> /// <returns>环的形状列表</returns> private static IEnumerable<Shape> GetRingShapes(Point center, IEnumerable<RingPart> ringParts) { var shapes = new List<Shape>(); foreach (var ringPart in ringParts) { var innerEllipse = new EllipseGeometry(center, ringPart.RadiusX, ringPart.RadiusY); var outterEllipse = new EllipseGeometry(center, ringPart.RadiusX + ringPart.SpanRadiusX, ringPart.RadiusY + ringPart.SpanRadiusY); // 根据里外椭圆求出圆环的形状 var ringGeometry = new CombinedGeometry(GeometryCombineMode.Xor, innerEllipse, outterEllipse); var ringPath = new Path { Data = ringGeometry, Fill = ringPart.FillBrush }; shapes.Add(ringPath); } return shapes; } } }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/67934.html