Algorithm 用有限数量的线段和圆弧近似曲线

Algorithm 用有限数量的线段和圆弧近似曲线,algorithm,geometry,computational-geometry,Algorithm,Geometry,Computational Geometry,是否有任何算法允许在x-y平面(即由x和y定义的有序点集)上近似具有有限数量的线段和圆弧(恒定曲率)的路径?结果曲线需要为C1(坡度的连续性) 最大数量或线段和圆弧可以是一个参数。另一个有趣的约束是防止两个连续的圆弧圆没有中间线段连接它们 我看不出有任何方法可以做到这一点,我也不认为有任何方法可以做到这一点,但任何关于这一目标的暗示都是受欢迎的 示例: 考虑一下这条路。它看起来像一条直线,但实际上是一组非常接近的点。没有噪声,点序列的顺序是众所周知的 我想用最少数量的连续线段和圆弧(比如10

是否有任何算法允许在x-y平面(即由x和y定义的有序点集)上近似具有有限数量的线段和圆弧(恒定曲率)的路径?结果曲线需要为C1(坡度的连续性)

最大数量或线段和圆弧可以是一个参数。另一个有趣的约束是防止两个连续的圆弧圆没有中间线段连接它们

我看不出有任何方法可以做到这一点,我也不认为有任何方法可以做到这一点,但任何关于这一目标的暗示都是受欢迎的

示例:

考虑一下这条路。它看起来像一条直线,但实际上是一组非常接近的点。没有噪声,点序列的顺序是众所周知的

我想用最少数量的连续线段和圆弧(比如10条线段和10条圆弧)和C1连续性来近似这条曲线。分段/弧的数量本身不是一个目标,但我需要任何参数来减少/增加该数量,以达到参数化的某种简单性,同时以精度损失为代价

解决方案:

这是我的解决方案,基于Spektre的答案。红色曲线是原始数据。黑色直线是线段,蓝色曲线是圆弧。绿色十字是显示半径的弧中心,蓝色十字是线段可能连接的点

  • 根据斜率最大偏差和线段最小长度作为参数检测线段。将新分段台阶的坡度与现有分段的平均台阶进行比较。我更喜欢基于优化的方法,但我不认为它适用于数量、位置和长度未知的不相交线段
  • 用相切圆弧连接线段。要关闭系统,半径的选择应确保线段末端移动的可能性最小。出于我的目的,已添加了最小半径约束。我相信在拐点距离较远时(例如直线几乎平行)会有一些特殊情况需要处理,并与相邻线段相互作用

  • 所以你得到了一个点云。。。对于此类情况,通常认为靠近的点是连接的,因此:

  • 您需要添加关于哪些点接近哪些点的信息

    仅靠近曲线/直线内部2个相邻点的点。只有一个相邻点表示曲线/直线的端点,超过2个表示相交或过于接近或平行的直线/曲线。没有邻居意味着噪音或只是一个点

  • 将路径段组合在一起

    这称为连接组件分析。因此,您需要从邻居信息表中形成多段线

  • 检测线性路径块

    相邻线段之间的坡度相同,因此可以将它们连接到一条直线

  • 用曲线拟合其余部分

  • 此处为相关QAs:

    • 参见子链接,这里有很多适合的示例
    [Edit1]从数据上的#3进行简单的行检测

    我使用
    5.0度
    角度变化作为线的阈值,并将检测到的线的最小尺寸作为50个样本(太懒了,无法在假设点密度不变的情况下计算长度)。结果如下所示:

    点是检测到的线端点,绿线是检测到的线,白色的“线”是曲线,所以我现在看不出这种方法有任何问题

    现在的问题是关于左边的点(曲线),我认为也应该有几何方法,因为它只是圆弧,所以类似这样

    这也可能有帮助:


    C1要求必须有交替的直线和圆弧。还应意识到,如果允许足够多的线段,则可以用直线拟合每对点,并使用一个小圆弧来满足坡度连续性

    我建议使用这种算法

    1与一组(指定N个)直线段最匹配。(这方面肯定有成熟的算法。)

    2考虑直线段固定,并在每个关节处放置一个圆弧。单独处理每个关节,我认为您有一个容易处理的问题,即找到最佳圆弧中心/半径,以满足连续性并改善拟合


    3,现在你非常仔细地考虑所有弧中心和半径(由切线定义的段)作为一个全局优化问题。如果N较大,这当然会爆炸。

    用其他曲线近似给定曲线时,一个典型的约束是将近似曲线绑定到原始曲线内的ε软管上(用固定半径ε的圆盘表示)

    对于G1或C2连续近似(来自CNC/CAD的人喜欢)和BIARC(直线段可以被视为具有无限半径的圆弧),我的前同事开发了一种算法,给出了如下解决方案[点击放大]:

    以上图片取自项目网站:


    该算法速度快,即在O(nlogn)时间内运行,并且基于广义Voronoi图。然而,它没有给出精确的最小元素数的近似值。如果你想寻找理论上的最佳值,我会参考Drysdale等人的一篇论文,CGTA,2008。

    光栅或矢量输入?寻找没有样本输入/输出的曲线拟合很难推荐任何东西。我通常的向量形式方法是将采样点与邻域(连接组件分析)分组,然后确定它们是直线还是曲线(基于角度变化)