【发布时间】:2017-02-15 15:00:15
【问题描述】:
我正在尝试使用 WPF 绘制弧线段,但不知何故我无法弄清楚如何使用 ArcSegment-Element 进行此操作。
我有两个给定的圆弧点(P1 和 P2),我还有圆心和半径。
【问题讨论】:
我正在尝试使用 WPF 绘制弧线段,但不知何故我无法弄清楚如何使用 ArcSegment-Element 进行此操作。
我有两个给定的圆弧点(P1 和 P2),我还有圆心和半径。
【问题讨论】:
创建一个 P1 为 StartPoint 的 PathFigure 和一个 P2 为 Point 的 ArcSegment 和一个包含半径的二次方 Size。
示例:P1 = (150,100),P2 = (50,50),半径 = 100,即尺寸 =(100,100):
<Path Stroke="Black">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint="150,100">
<ArcSegment Size="100,100" Point="50,50"/>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
或更短:
<Path Stroke="Black" Data="M150,100 A100,100 0 0 0 50,50"/>
【讨论】:
我知道这有点旧,但这里有一个中心和两个角度的代码版本 - 可以轻松适应起点和终点:
大纲:
设置为画布
public void DrawArc(ref Path arc_path, Vector center, double radius, double start_angle, double end_angle, Canvas canvas)
{
arc_path = new Path();
arc_path.Stroke = Brushes.Black;
arc_path.StrokeThickness = 2;
Canvas.SetLeft(arc_path, 0);
Canvas.SetTop(arc_path, 0);
start_angle = ((start_angle % (Math.PI * 2)) + Math.PI * 2) % (Math.PI * 2);
end_angle = ((end_angle % (Math.PI * 2)) + Math.PI * 2) % (Math.PI * 2);
if(end_angle < start_angle){
double temp_angle = end_angle;
end_angle = start_angle;
start_angle = temp_angle;
}
double angle_diff = end_angle - start_angle;
PathGeometry pathGeometry = new PathGeometry();
PathFigure pathFigure = new PathFigure();
ArcSegment arcSegment = new ArcSegment();
arcSegment.IsLargeArc = angle_diff >= Math.PI;
//Set start of arc
pathFigure.StartPoint = new Point(center.X + radius * Math.Cos(start_angle), center.Y + radius * Math.Sin(start_angle));
//set end point of arc.
arcSegment.Point = new Point(center.X + radius * Math.Cos(end_angle), center.Y + radius * Math.Sin(end_angle));
arcSegment.Size = new Size(radius, radius);
arcSegment.SweepDirection = SweepDirection.Clockwise;
pathFigure.Segments.Add(arcSegment);
pathGeometry.Figures.Add(pathFigure);
arc_path.Data = pathGeometry;
canvas.Children.Add(arc_path);
}
【讨论】: