2010-12-12 5 views
2

Sagen wir, ich habe 3 aufeinanderfolgende Punkte (P1, P2, P3), wie man einen Bogen konstruiert, der alle 3 Punkte durchläuft?Gegeben 3 Punkte, wie man einen Bogen konstruiert, der durch sie geht?

Der Bogen muss die folgenden drei Eigenschaften haben:

  1. starten Radian
  2. End Radian
  3. Center Point

Der Bogen wird von Start Radian zu End Radian gegen den Uhrzeigersinn Weise gezeichnet .

Ich habe mit der Lösung versucht here, aber es funktioniert nicht, weil es einfach, dass P1 annimmt, Start Radian und P3 müssen entsprechen end radian entsprechen. Aber die Realität ist, dass dies nicht immer gültig ist.

Antwort

4

Zeichnen Sie zwei Linien zwischen ihnen und folgen Sie der Reihenfolge, in der der Bogen ausgeführt werden soll. Halbiere beide Linien und komme mit ihren Normalen. Der Schnittpunkt der Normalen ist der Mittelpunkt des Bogens. Zeichnen Sie Ihren Bogen von einem Endpunkt zum anderen mit dem angegebenen Mittelpunkt.

+0

'Zeichnen Sie Ihren Bogen von einem Endpunkt zum anderen ', eigentlich stecke ich hier fest. Es gibt zwei Möglichkeiten, den Bogen zu zeichnen, den Bogen so zu zeichnen, dass er alle 3 Punkte passiert, das ist der schwierige Teil. – Graviton

+0

Nimm die atan2() 'der drei Punkte. Sie werden die Reihenfolge kennen, in der sie sich befinden sollen, da Sie die ersten zwei Zeilen haben; Füge einfach 2 * pi hinzu, bis sie sich anordnen. –

+0

@lgnacio, ich verstehe Ihren Kommentar nicht ganz, würde es Ihnen etwas ausmachen, genauer darauf hinzuweisen? – Graviton

0

Ich hatte das gleiche Problem. Hier ist ein kleiner Ausschnitt in C dafür. Wie Sie sehen können, gibt es zwei mögliche Punkte für den Mittelpunkt. Ich hoffe, es hilft. Credits zu meinem bald 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; 
} 
Verwandte Themen