Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何计算非凸多边形的面积?_Algorithm - Fatal编程技术网

Algorithm 如何计算非凸多边形的面积?

Algorithm 如何计算非凸多边形的面积?,algorithm,Algorithm,假设多边形不自相交,最有效的方法是什么?多边形有N个顶点。 我知道它可以用坐标来计算,但是还有另一种通用的方法吗? < P>,我能想到的解决这个问题的最好方法是把多边形看成几个三角形,分别找到它们的面积,并将它们与总面积相加。所有多边形,无论是规则多边形还是不规则多边形,本质上都只是一组三角形(沿对角线切割一个四边形,形成两个三角形,从一个角到两个最相反的角切割一个五边形,图案继续)。这是非常简单的代码 这方面的通用算法可编码如下: function polygonArea(Xcoords, Y

假设多边形不自相交,最有效的方法是什么?多边形有N个顶点。
我知道它可以用坐标来计算,但是还有另一种通用的方法吗?

< P>,我能想到的解决这个问题的最好方法是把多边形看成几个三角形,分别找到它们的面积,并将它们与总面积相加。所有多边形,无论是规则多边形还是不规则多边形,本质上都只是一组三角形(沿对角线切割一个四边形,形成两个三角形,从一个角到两个最相反的角切割一个五边形,图案继续)。这是非常简单的代码

这方面的通用算法可编码如下:

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){ numPoints=len(Xcoords) area=0;//在循环中累积面积 j=numPoints-1;//最后一个顶点是第一个顶点的“上一个” 对于(i=0;i
  • 从多边形中获取3个连续点
  • 计算结果三角形的面积
  • 从多边形中删除3个点的中间
  • 做一个测试,看看移除的点是否在剩余的多边形内。如果它在内部,则从总面积中减去三角形面积,否则将其相加
  • 重复此操作,直到多边形由单个三角形组成,然后将该三角形的面积添加到总面积中
  • 编辑:要解决两次传递的问题,第一次传递仅处理剩余多边形内的顶点,第二次传递处理剩余多边形。

    如果移除的三角形不包含“孔”(多边形的其他顶点),则“一次撕裂一只耳朵”算法有效

    也就是说,您需要选择下面的绿色三角形,而不是红色三角形:

    但是,这样做总是有可能的(现在无法从数学上证明,但你必须相信我)。你只需要遍历多边形的顶点并执行一些包含测试,直到找到合适的三元组


    来源:我曾经根据我读到的内容对任意非相交多边形进行三角剖分。

    三角形的有符号区域
    a(T)
    ((x1,y1)、(x2,y2)、(x3,y3))被定义为下列矩阵行列式的1/2倍:

    |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)
    
    这是一个线性时间算法,并行化非常简单。请注意,当顶点的坐标都是整数值时,这是一个精确的算法


    除了使用坐标,让我来介绍一下人们在哪里很好地回答数学问题。@ringø这是一个非常好的编程问题。对你个人来说没有什么不好的地方,但是那些认为任何涉及一点数学的问题都不是编程的人实际上是在对社区造成伤害。@Gene一点也不。一些马蒂什人问题(复杂性、博弈论…)通常会在这里找到一个实用的答案(不涉及太多的理论和积分).然而,对于这个特别的问题,对于数学家来说,这应该是小菜一碟,而且算术公式可能很容易编程,并立即得到其他数学家的检查和确认,math.SE是一个很好的选择,依我看。我个人并不反对你,这是我会做的。纯粹的善意建议。。。没有其他意图…到目前为止你尝试了什么?另外,添加一些漂亮的图片将有助于其他人形象化你的问题。我不认为你的答案有任何错误。这些是有符号的梯形区域,而不是三角形,如果它们重叠就完全可以了。如果事实上,如果顶点使用叉积运算符d存储为2d向量实际上,它甚至可以简化为sum(v[i]^v[i+1])@AntonKnyazyev好的,谢谢,我删除了警告。@Jed如果你发现了错误,我会改正的(我在高中时就这么做了,如果有些事情太草率,我不会感到惊讶),但在粗略地看了一眼并尝试了几个例子之后,我认为这里的数学很好。什么样的例子不起作用?请注意,Xcoords和Ycoords的顺序显示了它们连接的顺序,这一点我似乎从未澄清过。@rp.beltran。我的道歉……你绝对正确!Timothy Shields的答案与你的答案相同我仍然(稍微)喜欢他的答案,因为面积的每一个增量都是一个三角形的(有符号的)面积,该三角形连接两个线段和原点(在/2之后),这对我来说更直观。不过,你的答案加起来还是一样的。谢谢你帮我看到我的错误:-)@Jed没问题,总是很高兴有更多的眼睛检查东西!我想我也更喜欢他的答案,特别是因为我觉得我的解释不够。我只是想确保没有任何技术上不准确的地方。这是最好的答案,但你应该扩展A()函数。还要注意,你对p[0]使用什么并不重要在这些A()调用中,您最好使用(0,0)常量并保存一些非常有趣的操作。如果您只需要知道多边形的总面积(如本例中的OP),我想执行实际的三角剖分毕竟是过火了(尽管完成后可以直接从单个三角形计算总面积)。下面是一个单线Matlab版本:area=abs(s