Programmatisch feststellen, ob zwei Geraden identisch sind

Im letzten Artikel haben wir uns damit beschäftigt, wie wir programmatisch den Schnittpunkt zweier Geraden bestimmen können. Dieser Artikel ist eine Ergänzung zum Thema, wir zeigen, wie wir mit Hilfe unserer Funktion berechneSchnittpunkt([...]) bestimmen können ob zwei Geraden aufeinander liegen, also identisch sind oder nicht.

Wie im letzten Artikel verwenden wir die folgenden generischen Geradengleichungen:
\(
g: \vec{x} = \vec{u} + t \vec{v} \\
h: \vec{x} = \vec{a} + r \vec{b}
\)

Zur Bestimmung des Schnittpunkts zweier Geraden haben wir folgende Formel hergeleitet:
\(
t = \frac{b_x (u_y – a_y) + b_y (a_x – u_x)}{v_x b_y – v_y b_x}
\)

Wir haben im letzten Artikel außerdem gezeigt, dass die Geraden parallel liegen, wenn der Nenner gleich \(0\) wird. Können wir auch mit der Berechnung prüfen ob die Geraden aufeinander, also pseudo parallel zueinender liegen? Tatsächlich funktioniert das auch. Die Geraden liegen nämlich genau dann aufeinander, wenn der Nenner und der Zähler der Formel \(0\) werden.

Ihr fragt euch, warum soll das so sein? Um das zu zeigen müssen wir erst einsehen, dass wenn der resultierende Vektor aus \((\vec{a} – \vec{u})\) linear abhängig zu \(\vec{b}\) ist und \(\vec{b}\) linear abhängig zu \(\vec{v}\) ist, die Geraden aufeinander liegen. Es ist natürlicherweise so, dass wenn \(\vec{b}\) linear abhängig zu \((\vec{a} – \vec{u})\) ist und \(\vec{b}\) linear abhängig zu \(\vec{v}\), dann ist auch \((\vec{a} – \vec{u})\) linear abhängig zu \(\vec{v}\). Das ergibt sich aus der Transitivität der linearen Abhängigkeit. Wenn dem so ist, können wir die Stützvektoren \(\vec{a}\) und \(\vec{u}\) durch Skalierung der Richtungsvektoren der jeweils anderen Geraden erreichen. Damit ist auch jeder andere Punkt der einen Geraden mit der Geradengleichung der anderen Geraden erreichbar. Also müssen die Geraden aufeinander liegen. Am besten macht ihr euch das zusätzlich anhand einer Skizze klar.

Was wir jetzt zeigen müssen ist, dass der Zähler genau dann \(0\) wird, wenn \(\vec{b}\) linear abhängig zu \((\vec{a} – \vec{u})\) ist. Die lineare Abhängigkeit lässt sich mit folgender Gleichung zeigen: \(\vec{b} = k(\vec{a} – \vec{u})\). Wir wissen aus der Betrachtung der linearen Abhängigkeit, dass \(\vec{e} = k \vec{d}\) äquivalent zu \(e_x d_y – e_y d_x = 0\) ist. Wenn wir für \(\vec{e}\) den Vektor \(\vec{b}\) und für \(\vec{d}\) den Vektor \((\vec{a} – \vec{u})\) einsetzen, kommen wir darauf, dass auch \(\vec{b} = k(\vec{a} – \vec{u})\) äquivalent zu \(b_x(a_y – u_y) – b_y(a_x – u_x) = 0\) ist. Der linke Term der Gleichung sieht ähnlich aus, wie der Zähler unserer Formel. Durch Äquivalenzumformung zeigen wir, dass dieser Term tatsächlich äquivalent zum Zähler unserer Formel ist.
\(
\begin{array}{rcll}
\vec{b} &=& k(\vec{a} – \vec{u}) \\
&\Leftrightarrow& \\
b_x(a_y – u_y) – b_y(a_x – u_x) &=& 0 &| \cdot (-1) \\
b_x \cdot (-1) \cdot (a_y – u_y) – (-1) \cdot b_y(a_x – u_x) &=& 0 \\
b_x (-a_y + u_y) – (-b_y)(a_x – u_x) &=& 0 \\
b_x (u_y – a_y) + b_y(a_x – u_x) &=& 0 \\
\end{array}
\)

Also ist der Zähler gleich \(0\), genau dann wenn, \((\vec{a}-\vec{u})\) linear Abhängig zu \(\vec{b}\) ist. Wenn der Nenner \(0\) ist, sind auch die Richtungsvektoren \(\vec{v}\) und \(\vec{b}\) linear abhängig. Sind Nenner und Zähler gleich \(0\) müssen also die Geraden identisch sein, das heißt jeder Punkt der einen Geraden liegt auch auf der anderen Geraden.

In C++ führt die Berechnung von 0.0/0.0 zum Ergebnis NaN. Wenn wir also für die Berechnung des Schnittpunktes einen Vektor mit den Werten (NaN | NaN) erhalten, sind die Geraden identisch. Wenn wir (+inf | +inf) oder (-inf | -inf) erhalten, liegen die Geraden echt parallel zueinander.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.