设计线性时间算法以检查n顶点多边形是否为凸

时间:2014-04-09 00:38:27

标签: algorithm computational-geometry

而且我也不应该假设多边形是非交叉的

我知道凸多边形是一个非交叉多边形,其特性是所有角度都小于PI,另一方面,方向始终是顺时针或逆时针。

所以我正在考虑运行已知为线性时间算法的格雷厄姆扫描并对其进行修改。

这是我的算法

we sort the vertices by orientation (using determinants)
Select the right most vertex in the Polygon P (call it r)
Let q and p be the next and second next vertex of Polygon P (based on orientation)
while(there is a vertex in the Polygon P)
  if orientation(p, q, r) == CW (clock wise , that means we changed directions)
     return false
  else
   r = p
   p = q
   q = next vertex
return true

算法准确(返回false表示不凸)

2 个答案:

答案 0 :(得分:2)

实际上,使用决定因素可以在恒定时间内检查角度是否小于或大于PI。 这总计为O(N)。

如果所有角度都具有相同的方向,我们仍应检查多边形是否也不是自相交的。 在这里,将所有补充角度相加并检查总和是否为2 * PI就足够了。 可以使用浮点并检查大致相等。 这也是O(N)。

但是,我们应该按照它们在多边形边框上的顺序访问顶点。 如果给你一个多边形,你可能已经有了这个顺序。 另一方面,如果在平面上仅给出一组点,则在这些点中具有顶点的多边形在一般情况下不是唯一的。 因此,不需要按任何方式对顶点进行排序:不仅是O(N log N),而且我们也会丢失重要的订单信息。

我们可以从任何顶点开始。

答案 1 :(得分:0)

您的算法不起作用

(例如,如果多边形链绕原点转动两次)

请参阅http://hal.inria.fr/inria-00413179/en