平滑折线,变形最小

时间:2009-09-23 00:36:57

标签: c# geometry smoothing polyline

我有一条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度。

是否有更好的方法来平滑这些曲线,这会使顶点更均匀地分布,而不会过多地影响区域?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

有人已将2种平滑算法移植到具有CPOL(免费)许可证的C#中,请参见此处:

https://github.com/RobinCK/smooth-polyline