给出3点,如何构建一个通过它的弧?

时间:2010-12-12 09:12:28

标签: c# geometry

假设我有3个连续点(P1P2P3),如何构建一个通过所有3个点的弧?

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

  1. 启动Radian
  2. 结束Radian
  3. 中心点
  4. 弧线以逆时针方式从Start Radian绘制到End Radian

    我尝试使用解决方案here,但它不起作用,只是因为它假设P1必须与Start Radian对应且P3必须对应end radian。但实际情况是,这并不总是有效的。

2 个答案:

答案 0 :(得分:4)

在它们之间绘制两条线,按照您希望弧线的顺序。将这两条线切成两半,提出它们的法线。法线的交点是弧的中心。使用给定的中心从一个端点到另一个端点绘制弧。

答案 1 :(得分:0)

我遇到了同样的问题。这是C中的一个小片段。如您所见,中心点有两个可能的点。我希望它有所帮助。积分给我很快的伊格纳西奥:

#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;
}