【问题标题】:Smooth polyline with minimal deformation变形最小的平滑折线
【发布时间】:2010-11-30 14:32:44
【问题描述】:

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

有没有更好的方法来平滑这些曲线,这样可以更均匀地间隔顶点,而不会对区域造成太大影响?

【问题讨论】:

  • “顶点间距更均匀”是什么意思?平滑算法要么放大信号,要么压缩信号。
  • 让我们看看我是否可以在 ascii 中做到这一点......想象一下我有以下折线(点是角): ●─●─●─●─────────── ──● 我想把它改成: ●────●────●────●────● “顶点间距”我的意思是我想让它们之间的距离任何给定的相邻顶点更相似。

标签: c# geometry smoothing polyline


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    如果您需要均匀间隔的顶点,即使它们定义的相邻线段几乎共线,这可能也无法正常工作。

    【讨论】:

    • 谢谢 Doug,这很有希望。
    【解决方案3】:

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

    【讨论】:

    • @whatnick,样条插值如何让我重新定位现有点?这将是在现有点之间添加点的好方法,但我不想更改多段线的拓扑。
    • 样条曲线存在误差限制(称为张力),用于最小化振荡。样条曲线基本上是一组多项式,您正在拟合一组通过您的点的曲线。拟合样条后,您可以进行误差估计,以确保生成的拓扑在您设置的张力范围内。
    【解决方案4】:

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

    【讨论】:

    • @Doug,此算法涉及添加点。我需要重新分配现有的积分。
    • 大卫,在这种情况下,我会使用这种(或另一种)平滑方法添加很多点,然后以均匀间隔将它们删除。在这种情况下,您可能会使用样条方法获得更好的运气,并通过某种方式检查您要删除的点在其两侧是否具有足够相似的曲线。问题是大多数平滑算法都是局部的(为了提高渲染效率等),但问题的最佳解决方案必然是全局的。
    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2013-06-30
    相关资源
    最近更新 更多