2004-12-18

Površina poligona pomoću koordinatâ vrhova

Timi:
Dakle, odmah cu prijeci na stvar, naravno. Frend mi radi nekakav programcic i treba mu knjiga iz Analiticke geometrije. Tocnije, treba mu formula kako izracunati povrsinu tijela (poligona), ako imas zadane koordinate.


Hej... poligon nije tijelo, poligon je lik. Poliedar je tijelo. U 3D prostoru problem je prilično kompliciraniji.

Uostalom, poliedar ne može ni biti zadan samo popisom točaka, jer se mora specificirati koje su s kojima spojene... a da ne govorim o tome da ono moje telefonsko pitanje, jesu li točke po redu, ne bi uopće imalo smisla...

Dakle, pretpostavit ću da se radi o poligonu u 2D... ako nije tako, preciziraj.

Ok, so, zadano nam je n točaka (xi,yi) , za i:1~n (n>=3). Također u skladu s telefonskim razgovorom, neka su one tim redom i spojene, odnosno za svaki i, točka (xi,yi) je spojena dužinom s točkom
(xi+1,yi+1). Preciznije, za svaki osim zadnjeg - točka (xn,yn) nije spojena ni sa kakvim (xn+1,yn+1) jer njega ni nema, već s točkom (x1,y1). No tome možemo doskočiti tako da uvedemo novi vrh s indeksom n+1, i izjednačimo ga s prvim. Dakle,
(xn+1,yn+1):=(x1,y1). Tako će formula biti jednostavnija.

Prilično je jednostavno. Nacrtaj poligon (u prvom kvadrantu je najlakše pratiti što se događa, ali možeš bilo gdje), i iz svakog vrha spusti okomicu na y-os. Svakom vrhu (xi,yi) sad odgovara spojnica (xi,yi) s točkom na y-osi (0,yi), a svakoj dužini koja spaja dva vrha (xi,yi) i (xi+1,yi+1), sada odgovara pravokutni trapez s vrhovima (0,yi), (xi,yi), (xi+1,yi+1) i (0,yi+1). Osnovice su mu paralelne s x-osi, dakle visina mu je paralelna s y-osi, pa je duljina visine upravo razlika yi+1-yi (zapravo apsolutna vrijednost od toga, ali predznak će nam biti od velike pomoći kasnije).

Duljine osnovicâ su mu, naravno, xi i xi+1, pa je duljina srednjice njihova aritmetička sredina (xi+xi+1)/2. Površina trapeza je umnožak visine i srednjice, dakle površina i-tog trapeza je
Pi :=(yi+1-yi)(xi+1+xi)/2. Opet, apsolutna vrijednost, no kao što rekoh, predznak će nam trebati.

E sad... imamo n trapezâ. Ti trapezi se dijele u dvije grupe - oni koji djelomično prekrivaju poligon (dakle, odgovaraju stranicama poligona koje su "dalje" od y-osi), te oni koji su u potpunosti "lijevo" od njega (odgovaraju bližim stranicama). Ono što je fora, je da
  1. Kad zbrojimo sve površine trapezâ u prvoj grupi, i od toga oduzmemo ukupnu površinu trapezâ u drugoj grupi, razlika je upravo površina mnogokuta.
  2. Je li trapez u prvoj ili drugoj grupi upravo je izrečeno usporedbom yi+1 i yi, odnosno predznakom gornje površine. Dobro, kojoj grupi odgovrara koji predznak, to ovisi o tome kojim redom smo išli obilaziti vrhove ("nadesno" ili "nalijevo"), no to i nije toliko bitno. Ako to fulamo, svi plusevi će postati minusi i obrnuto, pa ćemo dobiti točno suprotno od onog što smo htjeli. Budući da znamo da moramo dobiti pozitivan broj (površina!), možemo to riješiti stavljanjem apsolutne vrijednosti oko svega.
Dakle, površina mnogokuta je apsolutno od sume svih Pi (Zadnji, Pn, se računa s (xn,yn) i novom fiktivnom točkom (xn+1,yn+1):=(x1,y1)). Ona dvojka u nazivniku se može izlučiti iz svega, pa dobijemo formulu P=|sumi:1~n (yi+1-yi)(xi+1+xi)|/2 , odnosno
P=|(x1+x2)(y1-y2) + (x2+x3)(y2-y3) +...+ (xn+x1)(yn-y1)|/2 .
Susjedne x-eve zbrajamo, y-ove oduzimamo, i to množimo. Umnoške zbrojimo, uzmemo apsolutnu vrijednost i podijelimo s 2.

Evo i jedan primjer. Izračunajmo površinu peterokuta nastalog spajanjem točaka (2,3),(3,4),(4,7),(3,6),(2,4).
P=|(2+3)(3-4) + (3+4)(4-7) + (4+3)(7-6) + (3+2)(6-4) + (2+2)(4-3)|/2=
=|5*(-1)+7*(-3)+7*1+5*2+4*1|/2=
=|-5-21+7+10+4|/2=|-26+21|/2=|-5|/2=5/2 .

Stvar se može i ljepše zapisati...
2 3    5 *-1 = -5

3 4 7 *-3 =-21
4 7 7 * 1 = 7
3 6 5 * 2 = 10
2 4 4 * 1 = 4
2 3 <-ponovo +--
-5 --> 5/2




stvar je u tome da mislim da sam ti jedan podatak zaboravio napomenuti, a to je da taj geometrijski lik nije pravilan.


Gr. "Pravilan" može biti na puno načina.
No iz ovog što je nacrtano, zaključujem da se vjerojatno htjelo reći da nije konveksan (otprilike, ima prevelike kutove:). To je sasvim ok za navedenu formulu.

Moguce je da ovaj nacin koji si mi opisao sljaka i na ovom primjeru, no nisam bas siguran, a ti ces to puno prije skuziti nego ja.


Da, šljaka. Samo izvod treba malo ušminkati, ako ti treba... no mislim
da ti to i nije toliko potrebno. Ukratko, nemaš samo + i - , već
višestruke +eve i -eve, ali svi oni ti točno izlaze iz formule ovako kako je napisana. Nemaš brige. :-)

Nego... u međuvremenu sam uspio malo pojednostaviti formulu. Dakle, onaj izraz pod sumom se može staviti da bude xi(yi-1-yi+1). Naravno, sad imamo dva fiktivna y-a ... y0:=yn, s druge strane.

Sve skupa,
P=|x1(yn-y2) + x2(y1-y3) +...+ xn(yn-1-y1)|/2 .
Prilično manje računanja... nema više zbrajanja x-eva.

Nema komentara:

Objavi komentar