Parametrische Form der beiden Geraden:
Wir können dies direkt mit der Kramerschen Regel berechnen, wollen hier aber nochmal den Weg angeben.
Eliminieren von und weiteres Umformen:
Ist die Determinate der beiden Spaltenvektoren X und Y ungleich 0; erhalten wir:
und in analogerweise bei Elimination von :
d.h. vertausche mit und mit , also
Damit sich die Segmente (nicht nur die Geraden) schneiden, muss außerdem gelten:
Ist die Determinante gleich 0, so sind die beiden Geraden der Segmente parallel oder sogar identisch.
Wie unterscheidet man die beiden Fälle? Übung!
secintersectImplizite Form der Geraden des einen Segments
Und es ergeben sich die gleichen Resultate wie bei der ersten Methode (durch entsprechendes Umformen der Determinanten):
und analogerweise
Auch hier überprüft man
Schnittpunkt zwischen Segment und Strahl ist einfach: man überprüft auf entsprechend positiven Parameterwert!
Wir machen uns die Orientierung zunutze (wobei wir aber keine Information über den konkreten Schnittpunkt erhalten):
bool Intersect(point A, point B, point C, point D) {
return
Orientation(A,B,C)!=Orientation(A,B,D) &&
Orientation(C,D,A)!=Orientation(C,D,B);
}
Man sollte jedoch die Spezialfälle beachten (insbesondere liefert obige Funktion nicht das erwartete Ergebnis, wenn alle vier Punkte auf einer Geraden liegen: nämlich immer kein Schnittpunkt, obwohl sich die Segmente überlappen könnten).
Besser ist:
int Intersect(point A, point B, point C, point D) {
int abc(Orientation(A,B,C));
int abd(Orientation(A,B,D));
int cda(Orientation(C,D,A));
int cdb(Orientation(C,D,B));
if( abc!=abd && cda!=cdb ) return intersect;
if( abc==0 && abd==0 && cda==0 && cdb==0 ) return collinear;
return nointersect;
}
Den kollinearen Fall kann man dann durch lexikografischen Vergleich der vier Punkte lösen, falls notwendig.