简介
前段时间帮一个同事的忙,利用WPF实现的一个简单饼图,仅能看饼图的比例,无文字查看功能。效果图如下:
用法:
var sectorParts = new List();
sectorParts.Add(new SectorPart(, Brushes.Red));
sectorParts.Add(new SectorPart(, Brushes.Green));
sectorParts.Add(new SectorPart(, Brushes.GreenYellow));
sectorParts.Add(new SectorPart(, Brushes.HotPink));
sectorParts.Add(new SectorPart(, Brushes.Yellow));
var ringParts = new List();
ringParts.Add(new RingPart(, , , , Brushes.White));
var shapes = PieChartDrawer.GetEllipsePieChartShapes(midPoint, , , , sectorParts, ringParts);
foreach (var shape in shapes)
{
GrdPie.Children.Add(shape);
}
设置好饼图相关的信息,获取其各个组成部分,再将其添加到容器中。
原理
可以看出简介中的图由一系列中扇形和环组成,计算出扇形和环的形状就可以完成饼图的绘制了。
扇形
一个扇形由两边和一条弧组成,扇形的关键就在已知圆周的圆形和半径,以及扇形的边绕Y轴正向旋转的角度,如何求出扇形在圆周上的点。
在才开始我走了不少弯路,利用矩阵做了许多运算,结果都不对。后面灵机一动,发现不用那么麻烦。直接把圆平移至原点,计算出相应扇形在圆周上的点,再将其平移回来即可。代码如下:
///
/// 获取圆周上指定角度的点坐标
///
/// 圆心
/// 半径
/// 角度,从0到360度,以正北方向为0度,顺时针旋转角度增加
/// 在圆周上旋转角度后的坐标
public static Point GetCirclePoint(this Point center, double radius, double angle)
{
// 圆心平移到原点后0度所对应的向量
var zeroAngleVector = new Vector(, radius);
// 旋转角度所对应的矩阵
var rotateMatrix = new Matrix();
rotateMatrix.Rotate( + angle);
// 因旋转的中心点在原点,最后需要平移到实际坐标上
return (zeroAngleVector * rotateMatrix) + center;
}
有了圆的计算方法&#x