【问题标题】:Area of a irregular shape不规则形状的区域
【发布时间】:2011-02-02 22:24:28
【问题描述】:

我有一组位于图像上的点。这组点形成了一个不规则的封闭形状。我需要找到这个形状的面积。是否有任何用于计算面积的正常算法?或者库中是否有任何支持,例如 boost?我正在使用 C++。

【问题讨论】:

  • 下次尝试 Math Overflow (mathoverflow.net),然后回到这里,提出关于他们给你的最佳算法的实现的问题。你可能会得到更好的结果。
  • @Ricket:Math Overflow 是针对研究生及以上水平的研究问题。这个问题太简单了,会被拒绝。
  • 你可以试试这个链接:wikihow.com/Calculate-the-Area-of-a-Polygon希望对你有帮助

标签: c++ math shapes


【解决方案1】:

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

面积公式是

(假设最后一点与第一点相同)

你可以轻松实现它

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;

当然,顶点必须根据它们在多边形中的自然跟随来排序..

【讨论】:

  • 你是对的:因为公式假设 point[n] == point[0]。在算法中添加了最后一步。
  • 在倒数第二行,point[0] 没有指定它是使用 X 还是 Y。我假设 X,给定 forloop 中的代码。另外,我会将 forloop 括在括号中,以便于阅读。
  • 仅当最后一点与第一点不同时才需要倒数第二行。否则它会加 0(所以无论如何它都不会受到伤害)。
【解决方案2】:

有一个summation formula

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        Boost.Geometry 中支持多边形的面积计算(这还没有被 boost 所接受,而且使用起来非常混乱)。 否则,您必须首先确定由您的点定义的多边形。从外观上看,您的所有点都是多边形的顶点,因此这只是正确排序点集的简单问题。另一种可能性是您正在寻找点集的凸包(请参阅http://en.wikipedia.org/wiki/Convex_hull_algorithms)。

        【讨论】:

          【解决方案6】:

          没有谦虚,我向您推荐我对另一个问题Combined area of overlapping circles的回答。 Monte Carlo 是强大的、易于并行化的,并且最终会为您提供所需准确性的答案。

          【讨论】:

          • 在这种情况下,计算确切面积比执行 一个蒙特卡洛试验成本更低。
          • 判断一个点是否在多边形内并不比计算面积更容易。
          【解决方案7】:

          最简单的方法可能是对您的形状进行三角测量并计算三角形的面积。 Dave Eberly 有一个名为(Boost license)的库,可以帮助进行三角测量;还有更多信息here。例如,寻找 TriangulateEC。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-17
            相关资源
            最近更新 更多