Hallo Viktor,
Der Fragesteller wollte eine leichte (einfache) Lösung.
Du und auch Martin haben dies wohl übersehen.
ich denke eher, Du schätzt die Lösung ohne Kosinussatz als viel komplizierter ein, als sie in Wirklichkeit ist.
Zeichne Dir ein Koordinatensystem und trage die Punkte A und B an den Koordinaten (–l/2, 0) und (+l/2, 0) ein. Außerdem „irgendwo rechts (oder links) oben“ den Punkt P. Dessen gesuchte Koordinaten seien P’x und P’y. Gegeben sind außer A und B die Entfernungen von A zu P und B zu P: a = |A – P| und b = |B – P|.
Wie aus der Skizze hervorgeht, kannst Du für dieses Setup den Satz des Pythagoras so formulieren:
\Big(P_x’ + \frac{l}{2}\Big)^2 + {P_y’}^2 = a^2
\Big(P_x’ - \frac{l}{2}\Big)^2 + {P_y’}^2 = b^2
Das ist ein Gleichungssystem mit zwei Gleichungen für P’x und P’y. Dass es – obwohl nichtlinear – ruckzuck gelöst ist, sieht man schnell, weil es unmittelbar ins Auge fällt, wie sich P’y2 eliminieren lässt, nämlich durch Subtraktion beider Gleichungen. Somit liegt es nahe, die Gleichungen einmal voneinander zu subtrahieren und einmal zu addieren. Tut man das, und vereinfacht alles (wenige Zeilen genügen) hat man diese beiden Gleichungen da stehen:
2 l P_x’ = a^2 - b^2
{P_x’}^2 + {P_y’}^2 + \Big(\frac{l}{2}\Big)^2 = \frac{a^2 + b^2}{2}
Die Auflösung nach P’x und P’y geht im Kopf:
P_x’ = \frac{a^2 - b^2}{2 l}
P_y’
= \pm \sqrt{\frac{a^2 + b^2}{2} - \Big(\frac{l}{2}\Big)^2 - {P_x’}^2}
Damit kennst Du die Koordinaten des gesuchten Punktes P in dem Koordinatensystem, dessen x-Achse durch A und B verläuft und dessen Ursprung in der Mitte M = 1/2 (A + B) zwischen A und B liegt. Nun müssen sie nur noch auf die Koordinaten im Originalsystem umgerechnet („transformiert“) werden. Das ist mit einer Drehung um den Steigungswinkel der A-B-Geraden plus der Verschiebung um M erledigt. Das ist aber auch kein Hexenwerk:
P = \left(\begin{array}{cc} c & -s\ s & c \end{array} \right) P’ + M
Darin ist ((c, –s), (s, c)) die Drehmatrix, die auf P’ angewendet wird (man sehe die Punkte als Vektoren an), und das „+ M“ erledigt die anschließende Verschiebung. Mit c und s habe ich den Kosinus bzw. Sinus des A-B-Steigungswinkels abgekürzt. Es ist c = (Bx – Ax)/l und s = (By – Ay)/l. Den A-B-Steigungswinkel selbst braucht man gar nicht berechnen.
Und das wars schon. Als 5-Punkte-Programm sieht die „Ohne-Kosinussatz-Lösung“ so aus:
(1)
\Delta x = B_x - A_x
\quad\textnormal{und}\quad
\Delta y = B_y - A_y
(2)
l = \sqrt{{\Delta x}^2 + {\Delta y}^2}
(3)
P_x’ = \frac{a^2 - b^2}{2l}
P_y’ = \pm\sqrt{\frac{a^2 + b^2}{2} - \Big(\frac{l}{2}\Big)^2 - {P’_x}^2}
(4)
c = \frac{\Delta x}{l}
\quad\textnormal{und}\quad
s = \frac{\Delta y}{l}
(5)
P_x = c P_x’ - s P_y’ +\frac{1}{2}\big(A_x + B_x\big)
P_y = s P_x’ + c P_y’ +\frac{1}{2}\big(A_y + B_y\big)
Falls die Abstände a und b zu klein sind, ist der Radikant der Wurzel in (3) negativ. Dann gibt es keine Lösung.
Zum Vergleich die „Mit-Kosinussatz-Lösung“:
(1)
\Delta x = B_x - A_x
\quad\textnormal{und}\quad
\Delta y = B_y - A_y
(2)
l = \sqrt{{\Delta x}^2 + {\Delta y}^2}
(3)
\alpha = \pm \arccos\left(\frac{l^2 - a^2 + b^2}{2bl}\right)
(4)
\phi = \arctan\left(\frac{\Delta y}{\Delta x}\right)
(Achtung: Das Δx im Nenner kann Null sein → Sonderbehandlung erforderlich!)
(5)
P_x = A_x + a \cos(\phi + \alpha)
P_y = A_y + a \sin(\phi + \alpha)
Für den Fall, dass es keine Lösung gibt, weil die Abstände a und b zu klein sind, liegt das arccos-Argument nicht im Intervall [–1, +1].
Ich finde beide Varianten gleich einfach und nachvollziehbar (in (1) und (2) sind sie ohnehin identisch). Bemerkenswert an der Ohne-Kosinussatz-Variante ist der Umstand, dass sie ganz ohne trigonometrische Funktion auskommt. Das wäre bei der Ausführung auf einem Prozessor ohne Fließkommaeinheit ein großer Vorteil. Ich vermute, dass die Ohne-Kosinussatz-Lösung auch numerisch stabiler ist, weil die x- und y-Richtung darin gleichwertig auftritt.
Auch die Mit-Kosinussatz-Variante enthält in Punkt (5) übrigens eine Koordinatentransformation: Der Punkt (1, 0) wird zuerst um den Winkel Φ + α gedreht, dann um a gestreckt und schließlich noch um A verschoben.
Gruß
Martin