Матч 166, Выпуклый многоугольник (ConvexPolygon)

Дивизион 2, Уровень 3

 

Координаты вершин выпуклого многоугольника заданы в массивах x и y в порядке их последовательного обхода.  Вычислить площадь многоугольника.

 

Класс: ConvexPolygon

Метод: double findArea(vector<int> x, vector<int> y)

Ограничения: x и y содержат от 3 до 50 элемнтов, -10000 £ x[i], y[i]  £ 10000, многоугольник выпуклый и без самопересечений.

 

Вход. Абсциссы вершин многоугольника заданы в массиве x, а соответствующие им ординаты в массиве y.

 

Выход. Площадь выпуклого многоугольника.

 

Пример входа

x

y

{0,0,1}

{0,1,0}

{-10000,-10000,10000,10000}

{10000,-10000,-10000,10000}

{100,80,30,-30,-80,-100,-80,-30,30,80}

{0,58,95,95,58,0,-58,-95,-95,-58}

 

Пример выхода

0.5

4.0E8

29020.0

 

 

РЕШЕНИЕ

геометрия

 

Пусть (x1, y1), (x2, y2), …, (xn, yn) – координаты вершин выпуклого многоугольника, заданные в порядке его обхода по или против часовой стрелки. Тогда площадь многоугольника вычисляется по формуле трапеций:

S = abs()

где (xn+1, yn+1) = (x1, y1).

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <cmath>

using namespace std;

 

class ConvexPolygon

{

public:

  double findArea(vector<int> x, vector<int> y)

  {

    double s;

    int i;

    x.push_back(x[0]); y.push_back(y[0]);

    for(s = i = 0; i < x.size() - 1; i++)

      s += (y[i+1] + y[i]) * (x[i+1] - x[i]) / 2.0;

    return fabs(s);

  }

};