【问题标题】:Approximate a curve with a limited number of line segments and arcs of circles用有限数量的线段和圆弧逼近曲线
【发布时间】:2017-03-24 09:27:25
【问题描述】:

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

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

我没有看到任何方法可以做到这一点,我不认为有任何方法可以做到这一点,但欢迎任何关于这个目标的暗示。

示例:

Sample file available here

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

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

解决方案:

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

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

【问题讨论】:

  • 光栅还是矢量输入?寻找没有样本输入/输出的曲线拟合很难推荐任何东西。我对向量形式的常用方法是将采样点与邻居分组(连接分量分析),然后确定它们是直线还是曲线(基于每个距离的角度变化),然后将直线子段连接在一起并拟合曲线...
  • 向量输入:我把问题修改得更清楚了。输入是一组由 x 和 y 定义的点。

标签: algorithm geometry computational-geometry


【解决方案1】:

所以你得到了一个点云......对于这样的通常靠近在一起的点被认为是连接的,所以:

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

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

  2. 将路径段组合在一起

    这称为连通分量分析。所以你需要从你的邻居信息表中形成折线。

  3. 检测线性路径块

    这些在相邻线段之间具有相同的斜率,因此您可以将它们连接到单线。

  4. 用曲线拟合其余部分

此处相关的 QA:

[Edit1] 从 #3 对您的数据进行简单的线检测

我使用5.0 deg 角度变化作为线的阈值,并将检测到的线的最小尺寸作为 50 个样本(假设点密度恒定,懒得计算长度)。结果如下所示:

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

现在的问题是剩下的点(曲线)我认为也应该有几何方法,因为它只是圆弧所以像这样

这也可能有帮助:

【讨论】:

  • 我在问题中添加了一些细节以便更清楚。我想在我的情况下只需要步骤 3 和 4。首先检测线性路径块,然后将线段与曲线连接起来。需要修改段末端(延长/限制)以保持 C1 连续性。
  • @seb007 你是使用圆弧还是可以使用更好的椭圆弧或立方?
  • 只有圆弧和线段。理想情况下不是 2 个连续的弧。
  • @seb007 您应该以矢量形式共享示例测试数据以进行测试……最好是 ASCII 格式,以便于访问,如 SVG 或自定义 ASCII 转储。哪个项目符号有问题?
  • 第 3 步是问题所在:有很多可能性,我不确定仅斜率是否足够标准。两点之间的斜率可能会有很大差异,但如果两点之间的距离很小,则该点可能仍与线段“充分”对齐。
【解决方案2】:

C1 要求要求您必须交替使用直线和圆弧。还要意识到,如果您允许足够数量的线段,您可以轻松地用直线拟合每对点,并使用小弧线来满足坡度连续性。

我建议这个算法,

1 最适合一组(指定 N)直线段。 (当然有很好的算法。)

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

3 现在您已经非常接近尝试将所有圆弧中心和半径(由切线定义的线段)视为全局优化问题。如果 N 很大,这当然会爆炸。

【讨论】:

    【解决方案3】:

    当用其他曲线逼近给定曲线时,一个典型的约束是将近似曲线绑定到原始曲线内的 epsilon 软管(如果Minkowski sum 具有固定半径 epsilon 的圆盘)。

    对于 G1 或 C2 连续逼近(来自 CNC/CAD 的人喜欢),我的前同事开发了一种算法,该算法可以提供如下解决方案这个[点击放大]:

    上图取自项目网站:https://www.cosy.sbg.ac.at/~held/projects/apx/apx.html

    算法速度快,即运行时间为 O(n log n),基于广义 Voronoi 图。但是,它没有给出精确的最小元素数量的近似值。如果您寻找理论最优值,我会参考 Drysdale 等人的一篇论文,Approximation of an Open Polygonal Curve with a Minimum Number of Circular Arcs and Biarcs, CGTA, 2008。

    【讨论】:

      最近更新 更多