Najpierw rozwiążmy kilka zadań pomocniczych:
Sprawdzanie, czy punkty leżą po przeciwnych stronach prostej
Sprawdźmy, czy punkty r i s leżą po przeciwnych stronach prostej zawierającej odcinek pq.
Dla punktów p=(p.x,p.y), q=(q.x,q.y) i r=(r.x,r.y) niech M(p,q,r) oznacza wyznacznik macierzy
p.x p.y 1 q.x q.y 1 r.x r.y 1
Ma on ten sam znak, co sinus kąta nachylenia wektora pr do wektora pq (Banachowski, Diks, Rytter Algortmy i struktury danych, str 259.)
Wartość M(p,q,r) (z ogólnego wzoru na wyznacznik) wynosi p.x*q.y + p.y*r.x + r.y*q.x - (r.x*q.y + q.x*p.y + r.y*p.x).
Niech φ to kąt pomiędzy pq i pr. Wtedy:
M(p,q,r) > 0 wtw 0 < φ < π M(p,q,r) = 0 wtw (φ = 0 lub φ = π) M(p,q,r) < 0 wtw π < φ < 2π
Zatem aby punkty r i s leżały po przeciwnych stronach prostej pq, potrzeba i wystarczy, aby M(p,q,r) i M(p,q,s) były przeciwnych znaków, co można zapisać krócej jako:
Sprawdzanie, czy punkt należy do odcinka
Aby punkt p należał do odcinka qr, to musi należeć do prostej zawierającej qr (czyli M(q,r,p) musi byc równy 0), oraz rzuty p na osie X i Y muszą zawierać się w rzutach odcinka (czyli min(q.x,r.x) ≤ p.x ≤ max(q.x,r.x) i min(q.y,r.y) ≤ p.y ≤ max(q.y,r.y)).
Sprawdzanie, czy współliniowe odcinki przecinają się
Aby współliniowe odcinki pq i rs przecinały się, potrzeba i wystarcza by r ∈ pq lub s ∈ pq. Dla osi X powinniśmy więc mieć
min(q.x,p.x) ≤ r.x ≤ max(q.x,p.x) lub min(q.x,p.x) ≤ s.x ≤ max(q.x,p.x)
czyli
min(p.x,q.x) ≤ max(r.x,s.x) i min(r.x,s.x) ≤ max(p.x,q.x)
To samo dla osi Y. Podsumowując:
<b>jeśli</b> max(p.x,q.x) ≥ min(r.x,s.x) i max(r.x,s.x) ≥ min(p.x,q.x) i
i max(p.y,q.y) ≥ min(r.y,s.y) i max(r.y,s.y) ≥ min(p.y,q.y) <b>to</b> PRZECINAJĄ SIĘ
<b>wpp</b> ROZŁĄCZNE