Algorithm 什么';计算四边形面积的好算法是什么?

Algorithm 什么';计算四边形面积的好算法是什么?,algorithm,geometry,Algorithm,Geometry,我知道对于一般多边形已经有一个很好的问题了。对于四边形是否有更简单或更有效的算法?没有。我会用你提到的帖子里的公式 编辑: 为了详细说明这一点,您在文章中提到的方法(在Reed Copsey的回答中称为闭合多边形方法)最终将点列表分解为三角形,并使用叉积计算其面积。根据描述多边形的点的顺序(缠绕),它可以利用正区域和负区域,不进行任何三角剖分。因为它同时利用了正面积和负面积,所以这种方法不需要对构成四边形中每个三角形的直线进行任何计算,也不需要考虑四边形是否凸 也就是说,从概念上更容易理解将四边

我知道对于一般多边形已经有一个很好的问题了。对于四边形是否有更简单或更有效的算法?

没有。我会用你提到的帖子里的公式

编辑:

为了详细说明这一点,您在文章中提到的方法(在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个操作。完全相同的操作数

因此,最大的区别在于,三角剖分后的叉积面积计算更容易理解,因为它非常简单,而闭合多边形方法实际上是相同的算法,但经过优化,因此以不同的方式呈现

总而言之,是的,你在文章中提到的公式是你得到的最有效的公式,同时也是最简单的算法,如果以不同的方式呈现。

对于(凸)四边形,将四边形拆分为两个三角形并计算两个三角形的面积通常更快

如果四边形不能保证是凸面的,那么我仍然喜欢四边形,因为它通常比检查更快地找出如何正确分割四边形


根据评论编辑:


正如Walt W指出的,这两种方法在性能方面在理论上是相同的。第二个更灵活,因为不需要凸四边形,但第一个(分割三角形)更容易实现和理解,因此可能更易于维护。

页面列出了几个公式。

将四边形分成两个三角形,并计算两个三角形的面积

一旦你有了两个三角形,它就可以在计算机程序中正常工作

对于边为a、b和c的三角形,面积为

double area = Math.Sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)/16);

此方法适用于任何四边形,无论是矩形、正方形、菱形还是梯形。

有一些四边形不是矩形、正方形、菱形或梯形!如里德所说,如果它们是凸的,“分成两个三角形”是一项不平凡的任务。@肯:那应该是“如果它们不是凸的”。。。凸四边形很简单,因为任何一个中断都是有效的。非凸四边形会导致严重的面积过度计算。那么,计算两组三角形的面积并选择最小值是最简单的解决方案吗?为什么向下投票。一般公式要求每个顶点对3次运算+1乘以0.5,这相当于一个四边形的3*4+1=13次运算。另外,上面帖子中提到的封闭多边形方法是问题中提到的原始公式……最初,它看起来像是我经常看到的一个势利的答案。但你的编辑和评论赢得了回报。考虑把这些评论放在另一个编辑中。你会用哪一个公式来计算每个三角形的面积?你可以使用任何方法。我通常使用两个向量的1/2的叉积,但那是因为我几乎总是在3D空间中工作,这对非平面四边形有效(虽然,从技术上讲,在这种情况下,你应该做直纹曲面,这并不快)。好吧,我的问题是涉及多少操作?为什么这比使用闭合多边形方法要快(正如你所说,这与OP提供的链接公式相同)?沃尔特:闭合多边形方法,当你把它放到这一点上时,基本上只是做叉积。计算的数量应该是相同的或接近相同的,但是IMO更容易理解。然而,正如我所说的,如果不能保证正确性,我就使用它。(也要意识到,闭合多边形链接方法只适用于计算2D区域,而不是3D区域。如果你需要将其扩展到3D,它的计算量比你发布的要多很多…)作为记录,我只是想客观地解决这个问题。但当我做叉积时,我得到一个三角形为:(x1-x0)*(y2-y0)-(y1-y0)*(x2-x0)=面积*2=7次运算。对于两个三角形,加上