两个点和半径之间的弧段

Egg*_*ggi 6 c# wpf geometry

我试图使用WPF绘制弧段,但我不知道如何使用ArcSegment-Element弄清楚如何做到这一点.

我有两个圆弧点(P1和P2),我也有圆心和半径.

在此输入图像描述

Cle*_*ens 5

创建一个带有P1 as的PathFigure StartPoint和一个带有P2的ArcSegment Point和一个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>
Run Code Online (Sandbox Code Playgroud)

或更短:

<Path Stroke="Black" Data="M150,100 A100,100 0 0 0 50,50"/>
Run Code Online (Sandbox Code Playgroud)


joh*_*135 5

我知道这有点旧,但是这里有一个用于中心和两个角度的代码版本-可以轻松地适应起点和终点:

大纲:

  • 制作一条路径并将“左上角”设置为0,0(如果需要,您仍然可以使center为负-这仅用于路径参考)
  • 设置样板PathGeo和PathFigure(这些是Word等中多段路径的构建块)
  • 做角度检查
  • 如果大于180度(弧度),则称其为“大角度”
  • 查找起点和终点并进行设置
  • 根据数学公式,它是顺时针旋转(请记住,正Y向下,正X向右)
  • 设置为画布

    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);
    }
    
    Run Code Online (Sandbox Code Playgroud)