Площадь неправильной формы

У меня есть набор точек, которые лежат на изображении. Эти точки образуют неправильную замкнутую форму. Мне нужно найти площадь этой фигуры. Есть ли тело, которое является нормальным алгоритмом, используемым для вычисления области ? Или есть ли какая-либо поддержка в библиотеках, таких как boost? Я использую C++.

7 ответов


Если вы полигон прост (у него нет какой-либо общей точки, кроме пар последовательных сегментов), то Википедия приходит вам на помощь:

формула для области

alt text

(предполагается, что последняя точка совпадает с первой)

вы можете легко реализовать его как

float area = 0.0f;

for (int i = 0; i < numVertices - 1; ++i)
  area += point[i].x * point[i+1].y - point[i+1].x * point[i].y;

area += point[numVertices-1].x * point[0].y - point[0].x * point[numVertices-1].y;

area = abs(area) / 2.0f;

конечно, вершины должны быть упорядочены в соответствии с их естественным следованием в многоугольнике..


здесь суммирование формуле для этого.


возможно, вы захотите быть более точным, возможно, даже предоставив графический пример.

например, если точки, которые у вас есть, просто пиксели, то количество пикселей равно площади. Но если точки являются углами многоугольника, то площадь многоугольника не так легко определить. Вы бы использовали многоугольник триангуляцию, и суммировать площади полученных треугольников.


Примечание: Если вы не знаете порядок точек и не можете гарантировать, что ваш многоугольник выпуклый, невозможно определить порядок фигуры, так как может быть более одного возможного порядка точек, которые производят многоугольник. Если вы знаете, что многоугольник выпуклый, определить порядок точек легко. Просто отсортируйте точки по углу от одной конкретной точки. с первой точки этой линии между собой и начальную точку такие, что все остальные точки находятся на одной стороне линии. Треугольники, образованные этим процессом, также могут быть использованы для вычисления площади.


существует поддержка расчета площади полигонов в Boost.Геометрия (которая еще не принята в boost и которая очень запутана в использовании). В противном случае вам придется сначала определить полигон, который определяется вашими точками. Судя по всему, все ваши точки являются вершинами многоугольника, поэтому это просто вопрос правильного порядка ваших наборов точек. Другая возможность заключается в том, что вы ищете выпуклую оболочку набора точек (см. http://en.wikipedia.org/wiki/Convex_hull_algorithms).


без скромности отсылаю вас к моему ответу на другой вопрос Объединенная область перекрывающихся кругов. Монте-Карло надежен, легко распараллеливается и в конечном итоге даст вам ответ на требуемую точность.


самый простой способ сделать это, вероятно, триангулировать вашу форму и вычислить площадь треугольников. У Дэйва Эберли есть библиотека под названием (Boost license), которая может помочь с триангуляцией; есть больше информации здесь. Ищите TriangulateEC, например.