Winkel zwischen Punkten
-
Hallo,
habe eine Frage. Ich habe gegeben zwei Punkte (Vektoren), meinetwegen P1(x1|y1) und P2(x2|y2).
Ich habe nun zwei Ansätze, den Winkel zwischen den beiden Veltoren zu berechnen:
Möglichkeit 1:
beta = atan2(b.getY() - a.getY(), b.getX() - a.getX()); Dies gibt mir aber den Winkel zwischen den beiden Koordinaten vom Ursprung aus gesehen an, oder? Das heißt, dieser Winkel liegt nicht an Punkt P2 und da brauche ich ihn hin.Möglichkeit 2:
double skalarprodukt = a.getX() * b.getX() + b.getY() * b.getY();
double norm_a = sqrt(pow(a.getX(), 2) + pow(a.getY(),2));
double norm_b = sqrt(pow(b.getX(), 2) + pow(b.getY(),2));
beta = skalarprodukt / (norm_a * norm_b);
double bogenmass = acos(beta); // ?? oder 180 / PI
Hier ist die Eingabe was komplizierter, ich berechne zunächst die Differenz zwischen beiden Punkten, also dif_x = x2-x1 und dif_y = y2-y1 und mache somit den P2 zum "Ursprung", indem ich dann P2, also b = (5,0) und a (dif_x, dif_y) eingebe. Geometrisch bedeutet das doch, dass ich sozusagen P2 an (0,0) habe und dann nur zwischen (5,0) und (dif_x,dif_y) den Winkel berechne. Aber: Es klappt auch nicht!Kann das Probleme machen, wenn das Koordinatensystem (wie bei GUIs üblich seinen Ursprung links oben hat? die y sind "spiegelverkehrt", aber das habe ich in meinem Code schon berücksichtigt.
Hat einer irgendwelche Ideen?
-
Zwischen zwei Punkten gibt es keinen Winkel, wo sollte der sein?
Wenn du den Winkel zwischen zwei Vektoren haben willst (den kann man finden, weil zwei Vektoren einen dritten Punkt (den Ursprung) als Bezugspunkt haben) ist dein zweiter Ansatz der übliche Weg. Beim ersten Ansatz verstehe ich nicht ganz, wie du den atan aus zwei Argumenten ziehen willst.
Dein Problem ist, dass du einen der Vektoren zu (0,0) transformierst. wenn du dann durch seine Norm teilst, ist diese 0. Geometrisch kannst du dir das so vorstellen, dass du zwei von deinen drei Punkten übereinander geschoben hast und so effektiv nur noch zwei hast. Und zwischen zwei Punkten kann man keinen sinnvollen Winkel angeben (bzw. er ist immer 0, wenn man so will)
Kochrezept für den Winkel zwischen drei (voneinander verschiedenen!) Punkten (x1,x2) (y1,y2) (z1,z2) mit (y1,y2) als Bezugspunkt:
1. Verbindungsvektoren berechnen:
dx1=x1-y1
dx2=x2-y2
dz1=z1-y1
dz2=z2-y2
2. Länge der Verbindungsvektoren berechnen:
norm_dx=sqrt(dx1*dx1+dx2*dx2)
norm_dz=sqrt(dz1*dz1+dz2*dz2)
3. Länge der Verbindungsvektoren normieren:
dx1=dx1/norm_dx
dx2=dx2/norm_dx
dz1=dz1/norm_dz
dz2=dz2/norm_dz
4. Skalarprodukt der normierten Verbindungsvektoren berechnen:
skalarprodukt=dx1*dz1+dx2*dz2
5. Arkuscosinus davon ziehen:
winkel=acos(skalarprodukt)Der Winkel ist dann in der Einheit mit der dein Rechengerät Winkel angibt, Computer rechnen üblicherweise im Bogenmaß(rad), manche Taschenrechner mit Grad(deg). deg=rad*180/Pi
Edit: Ein paar Erläuterungen hinzugefügt