多边形C ++的凸性?

时间:2013-03-03 21:00:30

标签: c++ algorithm polygon computational-geometry convex

如何通过了解多边形的点来测试多边形 是否 与他们在c ++中的coordonates?

3 个答案:

答案 0 :(得分:2)

对于多边形的每一边,计算线方程(Ax+By+C=0)并检查(将xy放入方程并得到它的符号),所有点都来自一侧它的。

修改: 如果行进凸多边形,您将始终在每个点上向一个方向(左或右)旋转。 使用交叉产品,您可以简单地推断出您将在下一轮转动的哪一侧(负面或正面)。如果三个连续点的所有叉积都具有相等的符号,则多边形是凸的。

答案 1 :(得分:1)

  礼品包装算法是一种计算凸起的算法   一组给定点的船体。

来自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

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

答案 2 :(得分:1)

使用任何常用算法找到凸包。当且仅当其所有顶点都属于其凸包时,多边形才是凸的。

这是O(n log n),但不依赖于在多边形边缘周围以正确顺序给出点的假设。如果假设为真,则仇恨引擎的答案是最优的(即线性时间。)