我发现对于一般多边形here已经有了一个很好的问题。是否存在特定于四边形的更简单或更有效的算法?
答案 0 :(得分:12)
对于(凸)四边形,将四边形分成两个三角形通常会更快,并计算两个三角形的面积。
如果四边形不能保证是凸的,那么closed polygon approach仍然是我的偏好,因为它通常比检查更快以找出如何正确分割四边形。
从评论中编辑:
正如沃尔特W指出的那样,这两种方法在性能方面在理论上是相同的。第二个是更灵活的,因为不需要凸四边形,但第一个(分裂三角形)更容易实现和理解,因此可能更易于维护。
答案 1 :(得分:7)
不。我会在你提到的帖子中使用这个公式。
编辑:
要详细说明,你提到的帖子中提出的方法(在Reed Copsey的答案中称为闭合多边形方法)最终会将点列表分成三角形并使用交叉积来计算它们的面积。根据描述多边形的点的排序(缠绕),它可以通过利用正面和负面区域而不进行三角测量。因为它利用了正面和负面区域,这种方法不需要对构成四边形中每个三角形的线进行任何计算,并且四边形是否凸起并不重要。
也就是说,概念上更容易理解将四边形分解为两个非重叠三角形,并独立计算每个三角形的面积。这种方法也总能产生正确的结果。这种方法的复杂性在于决定哪一对相对顶点应该指定两个三角形之间的中断。如果你有一个非凸四边形并选择了错误的三角剖分,那么你最终会得到重叠的三角形(除非被考虑)会使区域结果偏斜。如果在计算这些三角形的区域时要小心,你会发现(特别是四边形的情况下)一个三角形总是包含在另一个三角形中。通过一些聪明,您可以使包含的三角形区域具有包含三角形区域的相反符号,这将再次产生正确的结果。
实质上,这两种算法是相同的。没有性能差异;假设四边形由x0,y0,x1,y1,x2,y2,x3和y3指定。然后闭合多边形方法具有以下操作:
area = 0.5 * abs( x0 * y1 - x1 * y0 + x1 * y2 - x2 * y1 +
x2 * y3 - x3 * y2 + x3 * y0 - x0 * y3 )
可以简化为:
area = 0.5 * abs( x0 * (y1 - y3) + x1 * (y2 - y0) + x2 * (y3 + y1) +
x3 * (y0 - y2) )
这完全符合(计算*和+')12个操作。另一种方法是,找到每个单独的三角形并采用交叉产品如下:
x2_line = x2 - x0
y2_line = y2 - y0
area = 0.5 * abs( (x1 - x0) * y2_line + (y1 - y0) * x2_line +
x2_line * (y3 - y0) + y2_line * (x3 - x0) )
可再次简化为:
x2_line = x2 - x0
y2_line = y2 - y0
area = 0.5 * abs( y2_line * (x1 - x0 + x3 - x0) + x2_line * (y1 - y0 + y3 - y0) )
这也适用于12个操作。完全相同的操作次数。
因此,最大的区别在于三角测量跟随跨产品区域计算更容易理解,因为它非常简单,而封闭多边形方法实际上只是相同的算法,但优化后因此呈现在另一种方式。
总而言之,是的,您提到的帖子中的公式是您获得的最有效的公式,同时也是最简单的算法,当呈现的方式不同时。
答案 2 :(得分:0)
mathworld页面列出了几个公式。
答案 3 :(得分:0)
将四边形分成两个三角形并计算两者的面积。
一旦有两个三角形,Heron's Formula在计算机程序中运行良好。
对于边a,b和c的三角形,区域为
double area = Math.Sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)/16);
此方法适用于任何四边形,无论是矩形,正方形,菱形还是梯形。