【问题标题】:Given 3 points, how to construct an arc that passes through them?给定 3 个点,如何构造一条穿过它们的弧?
【发布时间】:2021-10-16 09:12:35
【问题描述】:

假设我有3个连续点(P1,P2,P3),如何构造一个通过所有3个点的Arc?

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

  1. 开始弧度
  2. 结束弧度
  3. 中心点

弧线从Start Radian 以逆时针方式绘制到End Radian

我已经尝试过解决方案here,但它不起作用,仅仅是因为它假定P1 必须对应于Start Radian 并且P3 必须对应于end radian。但现实情况是,这并不总是有效的。

【问题讨论】:

    标签: c# geometry


    【解决方案1】:

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

    【讨论】:

    • Draw your arc from one endpoint to the other,实际上我被困在这里。画圆弧有两种方法,如何画圆弧使其通过所有 3 个点,这是最难的部分。
    • 取三个点的atan2()。由于您有前两行,因此您将知道您希望它们的顺序;只需添加 2*pi 直到它们排成一行。
    • @lgnacio,我不太明白你的评论,你介意更明确一点吗?
    • 三个点围绕中心成一定角度。当您通过atan2() 找到这些角度时,它们将处于 6 个顺序之一(123、231、312、321、132、213)。您需要找到您关心的两个顺序(可能是 123 和 321),并在无序的点上添加一个完整的圆圈,以便重新排列它们。
    【解决方案2】:

    我遇到了同样的问题。这是C语言中的一个小sn-p。如您所见,中心点有两个可能的点。我希望它有所帮助。感谢我即将到来的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 2017-07-24
      • 1970-01-01
      • 2012-07-15
      相关资源
      最近更新 更多