在 Silverlight 中繪製扇形

/// <summary>
/// 獲得扇形的 Path 對象。
/// </summary>
/// <param name="x">圖形左上角的座標之 x</param>
/// <param name="y">圖形左上角的座標之 y</param>
/// <param name="rotationAngle">扇形的角度。</param>
/// <param name="radius">扇形的半徑大小,更改其值會影響扇形大小。</param>
/// <param name="angle">扇形張開的角度,支持0 - 360 度,使用弧度。</param>
/// <returns></returns>
public static Path GetSectorPath(double x, double y, double rotationAngle, double radius, double angle, Color col)
{
    // 對整圓的特殊處理
    if (angle > Math.PI * 1.9999)
        angle = Math.PI * 1.9999;

    var path = new Path
    {
        Fill = new SolidColorBrush(col),
        RenderTransformOrigin = new Point(radius, radius),
        Stretch = Stretch.None,
        UseLayoutRounding = false
    };

    //繪製起始直線
    var startLine = new LineSegment()
    {
        Point = new Point(radius * 2, radius)
    };
    //繪製弧線
    var arcLine = new ArcSegment()
    {
        IsLargeArc = angle > Math.PI ? true : false,
        Size = new Size(radius, radius),
        Point = new Point(radius * Math.Cos(angle) + radius, radius * Math.Sin(angle) + radius),
        SweepDirection = SweepDirection.Clockwise
    };
    //繪製結束直線
    var endLine = new LineSegment()
    {
        Point = new Point(radius, radius)
    };
    //把三條線段集合在一起。
    var segments = new PathSegmentCollection { startLine, arcLine, endLine };

    //為直線的Data賦值,由三段封閉的線段繪製成一個扇形
    path.Data = new PathGeometry()
    {
        Figures = new PathFigureCollection() { new PathFigure()
                                                    {
                                                        StartPoint = new Point(radius, radius),
                                                        Segments = segments
                                                    }}
    };

    //設置扇形對稱軸偏轉角度。
    path.RenderTransform = new CompositeTransform()
    {
        Rotation = rotationAngle,
        CenterX = radius, // 很重要,設置旋轉中心。在 Path.RenderTransformOrigen 設置無效。
        CenterY = radius
    };

    path.SetValue(Canvas.LeftProperty, x);
    path.SetValue(Canvas.TopProperty, y);
    return path;
}

這段代碼的主要思路如下:

  1. 使用 Path 對象,組合兩條邊和一個弧來形成扇形。
  2. 弧線和邊均以 X 軸正方向為基準繪製。(一條邊為與 X 軸正方向重合的邊,其他線條以此為起點順時針方向繪製)
  3. 繪製完成後,使用 PathRenderTransform 屬性,將其旋轉到合適的開始角度。
  4. 使用 SinCos 函數計算相關座標。
当前页阅读量为: