什么是使用具有N个顶点的多边形估计给定形状的算法?

时间:2014-07-18 22:19:46

标签: algorithm geometry polygon

我有一个随机的形状。我想把它变成一个有N个顶点的多边形。是否有算法选择最佳的N个顶点来估计给定的形状?

例如,我有这样的形状:

shape

给定N,比如说20,在这个形状的周长上选择20个点以生成最佳拟合多边形的算法是什么?

这样的事情:

shape2 shape3

3 个答案:

答案 0 :(得分:4)

关于这一主题的文献很多,都在关键词之下 多边形链近似。 这是一部早期作品,subsequent 111 citations 可能比原来更有用:

  

Melkman,A。和O' Rourke,J。,   "在多边形链近似上,"   在Computational Morphology,Ed。 G.T.杜桑   Elsevier,North-Holland,1988:87-95。

答案 1 :(得分:1)

我们在评论中讨论的细化算法适用于弯曲折线,它通常是像素坐标链,但不一定是。它消除了在某些给定公差范围内呈现曲线“不必要”的点。让P_0P_n-1为折线终点,Eps为容差。我们将按如下方式生成这些要点的子序列:

function thin(P, I, J)
  return [] if J <= I + 1
  let P_k, I < k < J be a point at farthest 
      distance D from line through P_I and P_J
  return [] if D <= Eps
  return thin(P, I, k) | [P_k] | thin(P, k, J)

结果是[P_0] | thin(P, 0, n-1) | [P_n-1]

距离计算是标准的东西。来自dist(P, A, B)P的{​​{1}} A Babs(unitperp(B - A) dot (P - A))。反过来,perp(v) = [-v_y, v_x]unit(v) = v / sqrt(v dot v),最后是unitperp(v) = unit(perp(v))。当然在实际计算中你要比较距离平方而不是实际距离,以避免平方根计算获得一点速度优势。

你有一个封闭的多边形,所以你可以选择任何一个点Q作为P_0和P_N,其余的在它们之间。结果将是[Q] | thin(P, 0, n-1)thin(P, 0, n-1),具体取决于Q是否距离Eps的终点之间的行距离thin(P, 0, n-1)更远。< / p>

答案 2 :(得分:1)

使用Douglas-Peucker算法进行折线简化。

在最坏的情况下,它具有最佳情况O(N Log N)行为,并且(不幸的是)O(N 2)。有一个更复杂的变体称为DPHull,具有保证的O(N Log N)最差情况。参见Hershberger&amp; Sons的“加速Douglas-Peucker线 - 简化算法”。 Snoeyink。