Arii — formula determinantului

Mediu~15 min5 pași

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.

Observația-cheie

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
Catetele 4 și 3; aria așteptată = (4·3)/2 = 6.
d = (xB - xA)*(yC - yA) - (yB - yA)*(xC - xA)
  = (4 - 0)*(3 - 0)     - (0 - 0)*(0 - 0)
  = 12 - 0 = 12
arie = |12| / 2 = 6

Implementare 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;
}
Indiciu

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țieTimpSpațiu
Aria unui triunghiO(1)O(1)
Aria unui poligon cu n vârfuriO(n)O(1)
Greșeli frecvente

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 / 2 trunchiază; păstrează d întreg și împarte la 2.0 la final, altfel pierzi .5.
  • Overflow. Produsele de coordonate mari depășesc intlong long peste 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, unde d e determinantul (dublul ariei cu semn).
  • d == 0 înseamnă coliniaritate; semnul lui d dă orientarea.
  • Ține 2·arie ca long long și împarte la 2.0 la final; pentru poligoane, formula lui Gauss.

Întrebarea 1 / 3

Aria triunghiului cu vârfurile (0,0), (4,0), (0,3) este...