De ce contează?
Cum afli suprafața unui teren triunghiular când știi doar coordonatele colțurilor, fără riglă și fără înălțimi? Există o formulă care îți dă aria direct din cele trei perechi de numere — formula determinantului. O singură expresie, fără să măsori nimic.
Aria unui triunghi din coordonate
Pentru triunghiul cu vârfurile A(xA,yA), B(xB,yB), C(xC,yC), aria este:
arie = | (xB − xA)·(yC − yA) − (yB − yA)·(xC − xA) | / 2
Expresia din interiorul modulului e un determinant — același pe care l-ai folosit la
coliniaritate. Îl notăm d; atunci arie = |d| / 2.
d reprezintă dublul ariei cu semn. Semnul îți spune orientarea (sensul A→B→C: trigonometric
sau orar); modulul îți dă aria propriu-zisă. Dacă d == 0, punctele sunt coliniare (arie 0).
Algoritmul pas cu pas
Triunghiul A(0,0), B(4,0), C(0,3):
| varf | (0 | 0) | (4 | 0) | (0 | 3) |
| rol | A | B | C |
d = (xB - xA)*(yC - yA) - (yB - yA)*(xC - xA)
= (4 - 0)*(3 - 0) - (0 - 0)*(0 - 0)
= 12 - 0 = 12
arie = |12| / 2 = 6Implementare C++
#include <iostream>
#include <cmath>
using namespace std;
struct Punct { long long x, y; };
long long dublulAriei(Punct A, Punct B, Punct C) {
// determinantul cu semn = 2 * arie cu semn
return (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x);
}
int main() {
Punct A = {0, 0}, B = {4, 0}, C = {0, 3};
long long d = dublulAriei(A, B, C);
cout << llabs(d) / 2.0 << endl; // 6 (/2.0 pastreaza si .5 cand e cazul)
return 0;
}Aria poate avea parte zecimală .5 (de exemplu un triunghi cu 2·arie impar). Ține
2·arie ca întreg și împarte la 2.0 doar la afișare, ca să nu pierzi jumătatea.
Poligoane (formula ariei lui Gauss)
Pentru un poligon cu vârfurile P0, P1, ..., Pn-1 (în ordine), aria e suma determinanților:
long long doubleArea = 0;
for (int i = 0; i < n; i++) {
int j = (i + 1) % n; // urmatorul varf, ciclic
doubleArea += p[i].x * p[j].y - p[j].x * p[i].y;
}
double arie = llabs(doubleArea) / 2.0;Complexitate
| Operație | Timp | Spațiu |
|---|---|---|
| Aria unui triunghi | O(1) | O(1) |
Aria unui poligon cu n vârfuri | O(n) | O(1) |
Greșeli reale:
- Uiți modulul. Determinantul poate fi negativ (orientare orară); aria e
|d|/2, mereu pozitivă. - Împarți la 2 pe întregi prea devreme.
d / 2trunchiază; păstreazădîntreg și împarte la2.0la final, altfel pierzi.5. - Overflow. Produsele de coordonate mari depășesc
int→long longpeste tot. - Vârfuri în dezordine la poligon. Formula lui Gauss cere vârfurile în ordine pe contur; amestecate, dau o arie greșită.
Recapitulare
- Aria triunghiului =
|d| / 2, undede determinantul (dublul ariei cu semn). d == 0înseamnă coliniaritate; semnul luiddă orientarea.- Ține
2·ariecalong longși împarte la2.0la final; pentru poligoane, formula lui Gauss.