Distanța dintre două puncte — Pitagora în plan

Mediu~15 min9 pași

De ce contează?

Te uiți pe hartă la două orașe și vrei să știi cât de departe sunt „în linie dreaptă”, ca și cum ar zbura o pasăre între ele — nu pe drumul șerpuit. Tragi o linie directă și măsori. Exact asta calculează distanța dintre două puncte: cea mai scurtă cale dintr-un punct în altul, fără ocolișuri.

Formula distanței

Două puncte din plan, A(x1, y1) și B(x2, y2), formează împreună cu colțul unui dreptunghi un triunghi dreptunghic. Cele două catete sunt:

  • diferența pe orizontală: dx = x2 - x1;
  • diferența pe verticală: dy = y2 - y1.

Segmentul AB este ipotenuza acelui triunghi. Din teorema lui Pitagora, ipotenuza la pătrat este suma pătratelor catetelor, deci:

d = sqrt(dx^2 + dy^2) = sqrt((x2 - x1)^2 + (y2 - y1)^2)

Semnul lui dx sau dy nu contează: la pătrat, (-3)^2 și 3^2 dau amândouă 9. De aceea nu te interesează „în ce sens” mergi de la A la B.

Exemplu pas cu pas

Fie A(1, 2) și B(4, 6). Calculăm pe rând:

  • dx = x2 - x1 = 4 - 1 = 3
  • dy = y2 - y1 = 6 - 2 = 4
  • dx^2 + dy^2 = 9 + 16 = 25
  • d = sqrt(25) = 5

Distanța este exact 5. Catetele 3 și 4 cu ipotenuza 5 formează cel mai cunoscut triunghi dreptunghic cu laturi întregi.

AB
dx=3
dy=4
d=5
A(1,2) și B(4,6): catetele dx=3 și dy=4 dau ipotenuza d=5 (triunghiul 3-4-5).

Distanța la pătrat: de ce o folosești la comparații

Funcția sqrt întoarce un double — un număr cu virgulă care poate avea mici erori de rotunjire. Dacă întrebi doar care punct e mai aproape sau sunt egal depărtate?, nu ai nevoie de valoarea reală a distanței: îți ajunge să compari distanțele la pătrat.

Ideea cheie: dacă da și db sunt distanțe (numere pozitive), atunci

da < db este același lucru cu da^2 < db^2.

Funcția pătrat păstrează ordinea pe numere pozitive, așa că o comparație pe pătrate dă mereu același răspuns ca pe rădăcini — dar exact, pe întregi, fără float și fără rotunjire. Folosește sqrt doar la final, când chiar ai nevoie de valoarea reală a distanței (de afișat, nu de comparat).

Implementare C++

#include <iostream>
#include <cmath>
using namespace std;

// distanta reala (cu virgula): foloseste sqrt
double distanta(long long x1, long long y1, long long x2, long long y2) {
    long long dx = x2 - x1;
    long long dy = y2 - y1;
    return sqrt((double)(dx * dx + dy * dy));   // cast la double inainte de sqrt
}

// distanta la patrat (intreg exact): pentru comparatii si sortari
long long distantaPatrat(long long x1, long long y1, long long x2, long long y2) {
    long long dx = x2 - x1;
    long long dy = y2 - y1;
    return dx * dx + dy * dy;        // fara sqrt, ramane intreg
}

int main() {
    long long ax = 1, ay = 2;
    long long bx = 4, by = 6;

    cout << distanta(ax, ay, bx, by) << "\n";       // 5
    cout << distantaPatrat(ax, ay, bx, by) << "\n"; // 25

    return 0;
}

Observă că dx și dy sunt long long chiar înainte de înmulțire: așa produsul dx * dx se calculează tot pe long long și nu „se taie” la int.

Observația-cheie

Când vrei doar să compari sau să sortezi distanțe, compară pătratele, nu rădăcinile. Pătratul păstrează ordinea pe numere pozitive, rămâne întreg și e exact — sqrt îl folosești doar când ai nevoie de valoarea reală a distanței.

Greșeli frecvente
  • Overflow la (x2 - x1)^2 fără long long: cu coordonate de ordinul 10^9, pătratul ajunge la ~10^18 și depășește int. Ține diferențele și suma pe long long.
  • Compari distanțe cu sqrt: lucrezi pe double, iar rotunjirea poate întoarce greșit o egalitate sau o comparație la limită. Compară pătratele.
  • Uiți pătratul: sqrt(dx + dy) în loc de sqrt(dx*dx + dy*dy) — formula cere catetele ridicate la pătrat, nu adunate direct.
  • int în loc de double la sqrt: sqrt(25) pe întregi poate da rezultat trunchiat sau ambiguu; convertește la double înainte de sqrt.

Vizualizare

Trage de cele două puncte și urmărește cum se schimbă catetele dx, dy și ipotenuza care le leagă — vizualizatorul desenează triunghiul dreptunghic din spatele formulei.

Indiciu

Privește mereu segmentul dintre puncte ca pe ipotenuza unui triunghi: dx și dy sunt catetele, iar distanța iese imediat din Pitagora.

Recapitulare

  • Distanța euclidiană este sqrt((x2 - x1)^2 + (y2 - y1)^2) — Pitagora pe catetele dx și dy.
  • Pentru comparații și sortări folosește distanța la pătrat (întreg exact), nu sqrt, ca să eviți erorile de rotunjire la float.
  • Ține diferențele și pătratul pe long long, altfel (x2 - x1)^2 poate da overflow.

Întrebarea 1 / 3

Pentru A(1, 2) și B(4, 6), care este distanța euclidiană dintre cele două puncte?