我有一个随机的形状。我想把它变成一个有N个顶点的多边形。是否有算法选择最佳的N个顶点来估计给定的形状?
例如,我有这样的形状:
给定N,比如说20,在这个形状的周长上选择20个点以生成最佳拟合多边形的算法是什么?
这样的事情:
答案 0 :(得分:4)
关于这一主题的文献很多,都在关键词之下 多边形链近似。 这是一部早期作品,subsequent 111 citations 可能比原来更有用:
Melkman,A。和O' Rourke,J。, "在多边形链近似上," 在Computational Morphology,Ed。 G.T.杜桑 Elsevier,North-Holland,1988:87-95。
答案 1 :(得分:1)
我们在评论中讨论的细化算法适用于弯曲折线,它通常是像素坐标链,但不一定是。它消除了在某些给定公差范围内呈现曲线“不必要”的点。让P_0
和P_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
B
为abs(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。