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 = 3dy = y2 - y1 = 6 - 2 = 4dx^2 + dy^2 = 9 + 16 = 25d = 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 |
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.
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.
- Overflow la
(x2 - x1)^2fărălong long: cu coordonate de ordinul 10^9, pătratul ajunge la ~10^18 și depășeșteint. Ține diferențele și suma pelong long. - Compari distanțe cu
sqrt: lucrezi pedouble, 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 desqrt(dx*dx + dy*dy)— formula cere catetele ridicate la pătrat, nu adunate direct. intîn loc dedoublelasqrt:sqrt(25)pe întregi poate da rezultat trunchiat sau ambiguu; convertește ladoubleînainte desqrt.
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.
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 cateteledxșidy. - 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)^2poate da overflow.