Вычисление площади невыпуклого многоугольника

polygon.jpg

Многоугольник (не обязательно выпуклый) задан на плоскости перечислением координат вершин в порядке обхода его границ. Определить площадь многоугольника.

Входные данные:
- Число вершин в многоугольнике
- Координаты вершин, заданные в порядке обхода его границы по часовой стрелке
Выходные данные:
- Площадь заданного многоугольника

Решение.
Пусть дан многоугольник ABCDE (рис.1).
Количество вершин n = 5.
Отпустим от каждой вершины перпендикуляр на ось ox.
Площадь нашего многоугольника можно посчитать через интегралы:
S = ∫AB - ∫CB + ∫CD - ∫ED + ∫EA
Получается, что каждый интеграл представляет собой площадь соответствующей трапеции. Таким образом:
S = S ABJH – S CBJF + S CDIF – S EDIG + S EAHG
Иначе говоря, у нас есть две вершины: i и i+1. Если вершина i+1 расположена справа от вершины i, то эту площадь мы прибавляем, если слева – отнимаем.
----------------------------------------------------------------------------------
Sтрапеции = 1/2 *((a+b))*h, где a, b – основания трапеции, h – высота трапеции.
----------------------------------------------------------------------------------
Чтобы избавиться от 1/2 умножим все на 2.
2*S = (y2 + y1)*(x2 – x1) – (y2 + y3)*(x2 – x3) + (y4 + y3)*(x4 – x3) – (y4 + y5)*(x4 – x5) + (y1 + y5)*(x1 – x5) = y2*x2 – y2*x1 + y1*x2 – y1*x1 – y2*x2 + y2*x3 – y3*x2 + y3*x3 + y4*x4 – y4*x3 + y3*x4 – y3*x3 – y4*x4 + y4*x5 – y5*x4 + y5*x5 + y1*x1 – y1*x5 + y5*x1 – y5*x5 = x1 *(y5 – y2) + x2*(y1 – y3) + x4*(y3 – y5) + x5*(y4 – y1)
Отсюда видно, что
S = |∑(x[i] * (y[i-1] - y[i+1]))| / 2 , от i = 0 до i = n-1.
где (x0, y0) = (xn, yn)

Программа:

#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <graphics.h>
int x[100];  
int y[100];   //  массив вершин многоугольника (не более 100 точек)
 
int main()
{
   clrscr();  
   int i, n;
   long s, res = 0, sq = 0;
 
   cout << "Enter the number of vertices:" << endl;
   cin >> n;
 
   cout << "Enter coordinates:" << endl;
   for (i = 0; i < n; i++) {
     cin >> x[i]; // координата x
     cin >> y[i]; // координата y
   }
 
 
   int gd, gm;
   gd = DETECT;
   initgraph (&gd, &gm, "c:\\temp");
 
   // построение на экране многоугольника
   for (i = 0; i < n; i++) {   
     circle (x[i] + 150, y[i] + 150, 2);
     if (i == n - 1) {
       i = 0;
       line (x[i] + 150, y[i] + 150, x[n-1] + 150, y[n-1] + 150);
       break;
     }
     line (x[i] + 150, y[i] + 150, x[i+1] + 150, y[i+1] + 150);
   }
 
   // Расчет площади многоугольника через сумму площадей трапеций 
   for (i = 0; i < n; i++) {
     if (i == 0) {
       s = x[i]*(y[n-1] - y[i+1]); //если i == 0, то y[i-1] заменяем на y[n-1]
       res += s;
     }
     else
       if (i == n-1) {
	 s = x[i]*(y[i-1] - y[0]); // если i == n-1, то y[i+1] заменяем на y[0]
	 res += s;
       }
     else {
       s = x[i]*(y[i-1] - y[i+1]);
       res += s;
     }
   }
   sq = abs(res/2);
   cout << "-------------" << endl;
   cout << "Square:" << endl;
   cout << sq;
   getch();
 
   return 0;
}

Ключевые слова: 
многоугольник, полигон, площадь, трапеция, вычисление площади