假设二维空间中的一系列不自相交的点,确定结果多边形的面积的有效方法是什么?
顺便说一句,这不是作业,我也不是在找代码。我正在寻找一种描述,我可以用来实现我自己的方法。我有从点列表中提取一系列三角形的想法,但我知道有一堆关于凸多边形和凹多边形的边缘情况,我可能无法捕捉到。
发布于 2009-01-16 18:39:05
这是the standard method,AFAIK。基本上对每个顶点周围的叉积求和。比三角测量简单得多。
Python代码,给定一个表示为(x,y)顶点坐标列表的多边形,隐式地从最后一个顶点绕到第一个顶点:
def area(p):
return 0.5 * abs(sum(x0*y1 - x1*y0
for ((x0, y0), (x1, y1)) in segments(p)))
def segments(p):
return zip(p, p[1:] + [p[0]])
David Lehavi评论:值得一提的是该算法的工作原理:它是函数−y和x的Green's theorem应用程序;与planimeter的工作方式完全相同。更确切地说:
上面的公式=
integral_over_perimeter(-y dx + x dy) =
integral_over_area((-(-dy)/dy+dx/dx) dy dx) =
2 Area
发布于 2009-04-04 16:38:57
叉积是经典的。
如果你有大量这样的计算要做,试试下面的优化版本,它需要的乘法次数减少了一半:
area = 0;
for( i = 0; i < N; i += 2 )
area += x[i+1]*(y[i+2]-y[i]) + y[i+1]*(x[i]-x[i+2]);
area /= 2;
为了清晰起见,我使用数组下标。使用指针更有效。尽管好的编译器会帮你做到这一点。
假设多边形是“闭合”的,这意味着您将第一个点复制为下标为N的点。它还假设多边形具有偶数个点。如果N不是偶数,则附加第一个点的另一个副本。
该算法是通过展开并结合经典叉积算法的两次连续迭代而获得的。
我不太确定这两种算法在数值精度方面的比较。我的印象是,上述算法比经典算法更好,因为乘法往往会恢复减法的精度损失。当约束使用浮点数时,就像使用GPU一样,这可能会产生很大的差异。
编辑:"Area of Triangles and Polygons 2D & 3D"描述了一种更有效的方法
// "close" polygon
x[N] = x[0];
x[N+1] = x[1];
y[N] = y[0];
y[N+1] = y[1];
// compute area
area = 0;
for( size_t i = 1; i <= N; ++i )
area += x[i]*( y[i+1] - y[i-1] );
area /= 2;
发布于 2009-01-16 18:34:19
没有任何其他约束的一组点不一定是唯一定义多边形的。
因此,首先您必须决定从这些点构建哪个多边形-也许是凸包?http://en.wikipedia.org/wiki/Convex_hull
然后三角测量并计算面积。http://www.mathopenref.com/polygonirregulararea.html
https://stackoverflow.com/questions/451426
复制相似问题