我有一条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度。
是否有更好的方法来平滑这些曲线,这会使顶点更均匀地分布,而不会过多地影响区域?
答案 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#中,请参见此处: