Puncte în plan — poziții relative

Mediu~14 min5 pași

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”.
Observația-cheie

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
Mijlocul lui A(2,4) și B(6,8) este M(4,6) — media coordonatelor.

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.
Observația-cheie

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țieTimpSpațiu
Mijloc, coliniaritate (3 puncte)O(1)O(1)
Verificarea a n puncte coliniareO(n)O(1)
Greșeli frecvente

Greșeli reale:

  • Mijloc cu coordonate impare. (xA+xB)/2 pe întregi trunchiază; dacă vrei valoarea exactă, lucrează cu dublul coordonatelor sau cu double.
  • Overflow la determinant. (B.x - A.x)*(C.y - A.y) cu coordonate de 10⁹ depășește int → folosește long long.
  • Compari arii cu virgulă cu 0. Pentru coliniaritate, folosește determinantul întreg și == 0, nu abs(arie) < 0.0001.
  • Confunzi „același x” cu „coliniare”. Verticala e un caz particular; coliniaritatea generală cere determinantul.

Recapitulare

  • Același x → verticală; același y → orizontală; mijlocul = media coordonatelor.
  • Coliniaritatea se verifică exact cu determinantul întreg d: d == 0 înseamnă aliniere.
  • Folosește long long la determinant — produsul de coordonate mari depășește int.

Întrebarea 1 / 3

Două puncte au același x. Cum sunt unul față de celălalt?