2010-12-12 62 views
2

假設我有3個連續點(P1,P2,P3),如何構建一個通過所有3點的弧?鑑於3點,如何構建通過它們的弧線?

電弧必須具備以下3個屬性:

  1. 開始弧度
  2. 尾弧度
  3. 中心站

電弧從Start Radian吸引到End Radian在逆時針方式。

我試着解決here,但它不工作,只是因爲它假定P1必須對應於Start RadianP3必須符合end radian。但事實是,這並非總是有效的。

回答

4

在它們之間繪製兩條線,按照您想要的弧的順序。平分兩條線,提出它們的法線。法線的交點是圓弧的中心。用給定的中心繪製從一個端點到另一個端點的弧。

+0

'從一個端點繪製你的弧到另一個,實際上我卡在這裏。有兩種方法可以繪製弧線,如何繪製弧線以使其通過所有3個點,這是困難的部分。 – Graviton 2010-12-12 09:32:30

+0

取三點的atan2()。你會知道你想讓他們進來的順序,因爲你有兩條線;只需添加2 * pi直到他們排隊。 – 2010-12-12 09:44:24

+0

@ lgnacio,我不太瞭解你的評論,你是否介意在這方面更明確? – Graviton 2010-12-12 09:46:38

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