3

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

4 回答 4

2

我认为您正在寻找Chaikin 算法。这个想法有一个变体,它使平滑曲线直接通过(而不是“内部”)控制点,但我现在在谷歌上搜索它时遇到了麻烦。

于 2009-09-23T00:44:21.840 回答
1

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

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

于 2009-09-23T01:33:10.660 回答
0

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

于 2009-09-23T00:48:49.423 回答
0

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

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

于 2019-08-17T02:34:16.230 回答