多边形的凸性

Convexity of a polygon C++?

本文关键字:多边形      更新时间:2023-10-16

如何通过知道一个多边形还是非凸来检验用c++的坐标?

对于多边形的每条边,计算直线方程(Ax+By+C=0)并检查(将xy代入方程并求取符号),所有的点都在它的一边。

编辑:如果旅行凸多边形,您将始终在每个点上旋转到一个方向(向左或向右)。使用叉乘,你可以简单地推断,下一回合你将旋转到哪一边(负或正)。如果三个连续点的所有叉乘都是等号,那么你的多边形是凸的。

使用任意常用算法查找凸包。一个多边形是凸的当且仅当它的所有顶点都属于它的凸包。

这是O(n log n),但并不依赖于多边形边缘上的点以适当的顺序给出的假设。如果假设成立,那么仇恨引擎的答案是最优的(即线性时间)

礼品包装算法是一种计算凸的算法

伪代码来自wiki:

jarvis(S)
   pointOnHull = leftmost point in S
   i = 0
   repeat
      P[i] = pointOnHull
      endpoint = S[0]  // initial endpoint for a candidate edge on the hull
      for j from 1 to |S|-1
         if (endpoint == pointOnHull) or
            (S[j] is on left of line from P[i] to endpoint)
            endpoint = S[j]   // found greater left turn, update endpoint
      i = i+1
      pointOnHull = endpoint
   until endpoint == P[0] // wrapped around to first hull point

如果你的点与上述算法的检测点匹配,则多边形为凸。