面积不规则

时间:2010-03-31 13:12:04

标签: c++ math shapes

我有一组点在图像上。这些点形成不规则的闭合形状。我需要找到这个形状的区域。是否有任何身体是用于计算面积的常规算法?或者在诸如boost之类的库中是否有任何支持?我正在使用C ++。

7 个答案:

答案 0 :(得分:19)

如果多边形很简单(除了连续的段对之外没有任何共同点),那么维基百科可以帮助你:

该区域的公式为

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;

当然顶点必须根据它们在多边形中的自然跟随进行排序。

答案 1 :(得分:6)

有一个summation formula

答案 2 :(得分:1)

您可能希望更精确,甚至可能提供图形示例。

例如,如果您拥有的点仅仅是像素,则像素数等于该区域。但如果这些点是多边形的角,那么多边形的面积就不容易确定。您将使用多边形三角剖分,并对所获得的三角形的面积求和。

答案 3 :(得分:0)

注意:如果您不知道点的顺序并且不能保证多边形是凸的,则无法确定形状的顺序,因为可能存在多个可能的顺序一个多边形。如果您确实知道多边形是凸的,则确定点的顺序很容易。仅从一个特定点按角度对点进行排序。第一个点是在自身和初始点之间形成一条线的点,使得所有其他点都在线的同一侧。由此过程形成的三角形也可用于计算面积。

答案 4 :(得分:0)

在Boost.Geometry中支持多边形的面积计算(尚未被加入到boost中,并且使用起来非常混乱)。 否则,您必须首先确定由您的点定义的多边形。从它的外观来看,你所有的点都是多边形的顶点,所以这只是一个正确排序你的点集的问题。另一种可能性是你正在寻找你的点集的凸包(见http://en.wikipedia.org/wiki/Convex_hull_algorithms)。

答案 5 :(得分:0)

如果没有谦虚,我会引用您对另一个问题Combined area of overlapping circles的回答。蒙特卡罗功能强大,易于并行,最终将为您提供所需精度的答案。

答案 6 :(得分:0)

最简单的方法可能是对形状进行三角测量并计算三角形的面积。 Dave Eberly有一个名为(Boost许可证)的图书馆可能有助于三角测量;有更多信息here。例如,寻找TriangulateEC。