平滑折线,变形最小

我有一条2D闭合折线,相当光滑。 然而,定义折线的顶点不是相等的间隔。 有时两个会非常接近,有时多达四个会非常接近。

我想平滑折线,但是常规平均算法会缩小面积:

for (int i = 0; i < (V.Length-1); i++) { PointF prev = V[i-1]; //I have code that wraps the index around. PointF next = V[i+1]; PointF pt = V[i]; float ave_x = one_third * (prev.X + next.X + pt.X); float ave_y = one_third * (prev.Y + next.Y + pt.Y); smooth_polyline[i] = new PointF(ave_x, ave_y); } 

我的折线包含​​数千个点,两个相邻线段之间的角度通常小于1度。

有没有更好的方法来平滑这些曲线,这将使顶点更平等,而不会过多地影响区域?

您可以查看“曲线简化”文献,例如Douglas-Peucker算法或本文http://www.cs.ait.ac.th/~guha/papers/simpliPoly.pdf 。

如果您需要均匀间隔的顶点,即使它们定义的相邻线段几乎共线,这可能也不会很好。

我想你正在寻找Chaikin的算法 。 这个想法有一个变体,使平滑的曲线直接通过(而不是“内部”)控制点,但我现在无法谷歌搜索它。

您还可以使用样条线进行插值 – 只需在维基百科中搜索