De ce contează?
Privești trei stâlpi de pe marginea drumului. Sunt aliniați perfect sau unul e ieșit din rând? Ochiul ghicește, dar calculatorul trebuie să decidă exact, din coordonate. Lecția asta e despre relațiile dintre puncte: aliniere, mijloc, poziție relativă.
Poziții relative simple
Date două puncte A(xA, yA) și B(xB, yB):
- același
x→ sunt pe aceeași verticală (unul peste altul); - același
y→ sunt pe aceeași orizontală; - altfel, definesc un segment „oblic”.
Multe verificări geometrice se reduc la comparații simple de coordonate. Înainte de
formule complicate, întreabă-te dacă punctele nu cumva împart un x sau un y.
Mijlocul unui segment
Mijlocul segmentului AB are coordonatele medii:
M = ( (xA + xB) / 2 , (yA + yB) / 2 )
| A M B | (2 | 4) | (4 | 6) | (6 | 8) |
| rol | A | M | B |
Coliniaritate (trei puncte pe o dreaptă)
Trei puncte A, B, C sunt coliniare dacă „aria triunghiului” pe care l-ar forma
este 0. Calculăm o expresie întreagă (un determinant):
d = (xB − xA)·(yC − yA) − (yB − yA)·(xC − xA)
d == 0→ puncte coliniare;d != 0→ formează un triunghi.
Folosind d (întreg) eviți complet numerele cu virgulă și erorile de rotunjire. Compari
direct cu 0 — exact, nu aproximativ.
Implementare C++
#include <iostream>
using namespace std;
struct Punct { long long x, y; };
long long orientare(Punct A, Punct B, Punct C) {
// determinantul: >0, <0 sau =0
return (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x);
}
int main() {
Punct A = {0, 0}, B = {2, 2}, C = {4, 4};
if (orientare(A, B, C) == 0) {
cout << "coliniare" << endl; // se afiseaza
} else {
cout << "triunghi" << endl;
}
return 0;
}Vizualizare
Mută punctele în plan și observă cum se schimbă poziția relativă, mijlocul și alinierea:
Complexitate
| Operație | Timp | Spațiu |
|---|---|---|
| Mijloc, coliniaritate (3 puncte) | O(1) | O(1) |
Verificarea a n puncte coliniare | O(n) | O(1) |
Greșeli reale:
- Mijloc cu coordonate impare.
(xA+xB)/2pe întregi trunchiază; dacă vrei valoarea exactă, lucrează cu dublul coordonatelor sau cudouble. - Overflow la determinant.
(B.x - A.x)*(C.y - A.y)cu coordonate de 10⁹ depășeșteint→ foloseștelong long. - Compari arii cu virgulă cu 0. Pentru coliniaritate, folosește determinantul întreg
și
== 0, nuabs(arie) < 0.0001. - Confunzi „același x” cu „coliniare”. Verticala e un caz particular; coliniaritatea generală cere determinantul.
Recapitulare
- Același
x→ verticală; acelașiy→ orizontală; mijlocul = media coordonatelor. - Coliniaritatea se verifică exact cu determinantul întreg
d:d == 0înseamnă aliniere. - Folosește
long longla determinant — produsul de coordonate mari depășeșteint.