Dany jest wielobok n-wierzchołkowy, tzn. dane są współrzędne (x,y) kolejnych jego wierzchołków. Krawędzie wieloboku nie przecinają się.
Napisz progran, który wczyta z pliku liczbę wierzchołków i współrzędne kolejnych wierzchołków
oraz obliczy pole powierzchni tego wieloboku.
Rozwiązanie
Zbuduj trapezy prostokątne, oparte wysokością na osi X. Bok ukośny każdego trapezu będzie bokiem danego wieloboku, a podstawy każdego trapezu będą równe współrzędnym pionowym dwóch wierzchołków wyznaczających bok ukośny. (Można oczywiście odwrócić role osi X i Y)
Należy wybrać kierunek obejścia wieloboku i zsumować pola wszystkich kolejnych trapezów, wyznaczonych wierzchołkami: od i do i+1.
Przykład: pole trapezu wyznaczonego przez wierzchołki 1-2 będzie równe:
$t = \ \frac{(y2 + y1)}{2}*(x2 - x1)$
Idąc na rysunku w kolejności: 1-2-3-4-1 otrzymamy:
pola trapezów 1-2 i 2-3 o wartosciach dodatnich
pola trapezów 3-4 i 4-1 o wartościach ujemnych, bo wysokość będzie liczona: (x4-x3) oraz (x1-x4)
Jeśli pole wieloboku wyjdzie ujemne, to znaczy tylko, że wybraliśmy „zły” kierunek obejścia wieloboku. Wówczas trzeba wziąć wartość bezwzględną wyniku.
int xp,yp,x,y; // wspołrzędne wierzchołka bieżącego i poprzedniego
int pole=0; // pole całego wieloboku
int trapez; // pole pojedynczego trapezu
int n; // liczba wierzchołków
ifstream we("wiel3.txt");
we>>n;
we>>xp>>yp; // czytaj pierwszy wierzchołek
int x1=xp, y1=yp; // zapamiętaj pierwszy wierzchołek
for (int i=2; i<=n; i++) {
we>>x>>y; // czytaj dane kolejnego wierzchołka
trapez = (y+yp)*(x-xp) // pole trapezu zbudowanego na wierzchołku bieżącym i poprzednim
pole += trapez;
xp=x; // wierzchołek bieżący w następnym kroku stanie się wierzchołkiem poprzednim
yp=y;
}
trapez = (y1+yp)*(x1-xp); // pole ostatniego trapezu, od 1 do n
pole += trapez;
cout<<"pole = "<<pole/2.0<<endl;
Przykładowe dane:
8
4 15 6 16 12 19 17 16 18 15 19 6 19 0 0 0
Wynik: 279.5