C# 给定3个点,如何构造穿过它们的圆弧?

C# 给定3个点,如何构造穿过它们的圆弧?,c#,geometry,C#,Geometry,假设我有3个连续点(P1,P2,P3),如何构造一条穿过所有3个点的弧 弧必须具有以下3个属性: 起始弧度 端弧度 中心点 以逆时针方式从开始弧度到结束弧度绘制圆弧 我尝试过这个解决方案,但它不起作用,因为它假设P1必须对应Start Radian,P3必须对应end Radian。但现实是,这并不总是有效的 按照您希望圆弧的顺序在它们之间绘制两条线。将两条线平分,得到它们的法线。法线的交点是圆弧的中心。以给定的中心从一个端点到另一个端点绘制圆弧。我也有同样的问题。下面是一个C语言的小片段。如您

假设我有3个连续点(
P1
P2
P3
),如何构造一条穿过所有3个点的弧

弧必须具有以下3个属性:

  • 起始弧度
  • 端弧度
  • 中心点
  • 以逆时针方式从
    开始弧度
    结束弧度
    绘制圆弧


    我尝试过这个解决方案,但它不起作用,因为它假设
    P1
    必须对应
    Start Radian
    P3
    必须对应
    end Radian
    。但现实是,这并不总是有效的

    按照您希望圆弧的顺序在它们之间绘制两条线。将两条线平分,得到它们的法线。法线的交点是圆弧的中心。以给定的中心从一个端点到另一个端点绘制圆弧。

    我也有同样的问题。下面是一个C语言的小片段。如您所见,中心点有两个可能的点。我希望有帮助。归功于我的soon Ignacio:

    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    
    int main(void)
    {
        float x1,y1; //Punto A
        float x2,y2; //Punto B
        float x3,y3; //Punto medio
        float x,y;
        float z,t; //los otros posibles puntos
        float R; //Distancia
    
        printf("Introduce  Ax:\n");
        scanf ("%f",&x1);
        printf("Introduce  Ay:\n");
        scanf ("%f",&y1);
        printf("Introduce  Bx:\n");
        scanf ("%f",&x2);
        printf("Introduce  By:\n");
        scanf ("%f",&y2);
        printf("Introduce  Cx:\n");
        scanf ("%f",&x3);
        printf("Introduce  Cy:\n");
        scanf ("%f",&y3);
        printf("Introduce la distancia:\n");
        scanf ("%f",&R);
    
    
        x=-((-(x2*x2)+2*x1*x2-(x1*x1))*x3-(x3*y1*y1)+(2*x3*y1*y2)-(x3*y2*y2)+(y2-y1)*sqrt(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*R)/(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1);
        y=((y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*y3+(x2-x1)*sqrt(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*R)/(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1);
        printf ("x=%f\n",x);
        printf ("y=%f\n",y);
    
        z=((y2-y1)*sqrt((y2*y2)-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*R+x3*y2*y2-2*x3*y1*y2+x3*y1*y1+(x2*x2-2*x1*x2+x1*x1)*x3)/(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1);
        t=-((x2-x1)*sqrt(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*R+(-(y2*y2)+2*y1*y2-(y1*y1)-(x2*x2)+2*x1*x2-(x1*x1)*y3))/(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1);
        printf ("\nx=%f\n",z);
        printf ("y=%f\n",t);
        system("pause");
    
        return 0;
    }
    
    #包括
    #包括
    #包括
    内部主(空)
    {
    浮点x1,y1;//Punto A
    浮点x2,y2;//Punto B
    浮动x3,y3;//Punto medio
    浮动x,y;
    浮点数z,t;//los otros posibles puntos
    浮点R;//距离
    printf(“引入Ax:\n”);
    scanf(“%f”和&x1);
    printf(“介绍日期:\n”);
    scanf(“%f”、&y1);
    printf(“介绍Bx:\n”);
    扫描频率(“%f”和x2);
    printf(“介绍人:\n”);
    扫描频率(“%f”和“y2”);
    printf(“介绍Cx:\n”);
    scanf(“%f”、&x3);
    printf(“介绍Cy:\n”);
    扫描频率(“%f”和&y3);
    printf(“介绍距离:\n”);
    scanf(“%f”、&R);
    x=-(((x2*x2)+2*x1*x2-(x1*x1))*x3-(x3*y1*y1)+(2*x3*y1*y2)-(x3*y2*y2)+(y2-y1)*sqrt(y2*y2-2*y1*y2+x2*x2-2*x1*x2+x1*x1*R)/(y2*y2*y2*y2+y1*x1+x2*x1*x1+x1*x1*x1*x1);
    y=((y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*y3+(x2-x1)*sqrt(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*R/(y2*y2-2*y1+y1*y1*y1+y1+y1+x2+x2*x2*x2-2*x1+x1*x1*x1);
    printf(“x=%f\n”,x);
    printf(“y=%f\n”,y);
    z=((y2-y1)*sqrt((y2*y2)-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*R+x3*y2*y2-2*x3*y1*y2+x3*y1*y1+(x2*x2-2*x1*x2+x1*x3)/(y2*y2*y1+y1*y1+x2+x2*x2*x2+x2*x1*x1*x1);
    t=-((x2-x1)*sqrt(y2*y2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1*x1)*R+((y2*y2)+2*y1*y2-(y1*y1)-(x2*x2)+2*x1*x2-(x1*x1*x1*y3))/(y2*y2*y2*y2+y1*y1*y1+x2*x2*x1+x1*x1+x1*x1*x1*x1*x1*x1+x1*x1*x1*x1*x1;
    printf(“\nx=%f\n”,z);
    printf(“y=%f\n”,t);
    系统(“暂停”);
    返回0;
    }
    
    从一个端点到另一个端点画弧
    ,实际上我被困在这里了。有两种方法可以画弧,如何画弧,使它通过所有3个点,这是最难的部分。您将知道您希望它们的顺序,因为您有最初的两行;只需添加2*pi,直到它们对齐。@lgnacio,我不太理解你的评论,你介意更明确一点吗?这三个点与中心成一定角度。当您通过
    atan2()
    找到这些角度时,它们将是6个顺序中的一个(123、231、312、321、132、213)。您需要找到您关心的两个顺序(可能是123和321),并在顺序错误的点上添加一个完整的圆圈,以便重新排列它们。