假设多边形不会自相交,那么怎样才能以最高效的方式完成这个任务呢?该多边形有 N 个顶点。 虽然可以通过坐标计算,但是否还有其他通用方法呢?
假设多边形不会自相交,那么怎样才能以最高效的方式完成这个任务呢?该多边形有 N 个顶点。 虽然可以通过坐标计算,但是否还有其他通用方法呢?
有向面积,A(T)
,是指三角形 T = ((x1, y1), (x2, y2), (x3, y3))
的面积,其定义为下列矩阵行列式的一半:
|x1 y1 1|
|x2 y2 1|
|x3 y3 1|
行列式为 -y1*x2 + x1*y2 + y1*x3 - y2*x3 - x1*y3 + x2*y3
。
给定由顶点 p[0], p[1], ..., p[N-1]
定义的多边形(凸多边形或非凸多边形),您可以按以下方式计算多边形的面积。
area = 0
for i in [0, N - 2]:
area += A((0, 0), p[i], p[i + 1])
area += A((0, 0), p[N - 1], p[0])
area = abs(area)
A((0, 0), p, q)
,其结果为0.5 * (-p.y*q.x + p.x*q.y)
。进一步改进的方法是仅进行一次0.5
的乘法运算:area = 0
for i in [0, N - 2]:
area += -p[i].y * p[i+1].x + p[i].x * p[i+1].y
area += -p[N-1].y * p[0].x + p[N-1].x * p[0].y
area = 0.5 * abs(area)
这是一个线性时间算法,并且很容易并行化。还要注意,当您的顶点坐标都是整数时,它是一个精确的算法。
function polygonArea(Xcoords, Ycoords) {
numPoints = len(Xcoords)
area = 0; // Accumulates area in the loop
j = numPoints-1; // The last vertex is the 'previous' one to the first
for (i=0; i<numPoints; i++)
{ area = area + (Xcoords[j]+Xcoords[i]) * (Ycoords[j]-Ycoords[i]);
j = i; //j is previous vertex to i
}
return area/2;
}
Xcoords
和Ycoords
是数组,其中Xcoords
存储X坐标,而Ycoords
存储Y坐标。
该算法从先前的顶点迭代地构建三角形。
我从Math Open Ref提供的算法进行了修改。
将其适应于您存储坐标的形式以及您在项目中使用的任何语言应该是相对容易的。
编辑:为了解决@NicolasMiari提出的问题,可以进行两次操作,第一次仅处理位于剩余多边形内部的顶点,第二次处理剩余的顶点。
然而,这是有可能的(现在无法数学证明,但你必须相信我)。您只需要遍历多边形的顶点并执行一些包含测试,直到找到合适的三角形。
来源:我曾根据 Joseph O'Rourke 的 C语言计算几何中所述实现了任意非交多边形的三角剖分。