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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了近似具有有限数量的线段和圆弧的曲线相关的知识,希望对你有一定的参考价值。

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

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

我认为没有办法做到这一点,我认为没有办法解决这个问题,但是对这个目标的任何暗示都是值得欢迎的。

例:

Sample file available here

Discrete path defined by a suite of points

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

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

解:

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

Fitting

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

C1要求要求你必须有交替的直线和弧线。还要意识到,如果允许足够数量的线段,您可以通过直线轻松地适合每对点,并使用微小弧线来满足斜率连续性。

我建议这个算法,

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

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

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

另一答案

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

  1. 你需要添加关于哪些点接近哪些点的信息 点仅接近2个邻居,表示曲线/线的内部。只有一个邻居意味着曲线/线的终点,然后多于2表示交叉或太近的几乎或平行的线/曲线。没有邻居意味着噪音或只是一个点。
  2. 组路径段在一起 这称为连通成分分析。因此,您需要从邻居信息表中形成折线。
  3. 检测线性路径块 这些在相邻段之间具有相同的斜率,因此您可以将它们连接到单行。
  4. 用曲线拟合其余部分

这里有相关的QAs:

[Edit1]从您的数据#3开始的简单线路检测

我使用Trace a shape into a polygon of max n sides角度变化作为线条的阈值,并且将检测到的线条的最小尺寸用作50个样本(假设恒定点密度,懒得计算长度)。结果如下:

5.0 deg

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

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

  • lines

这也可能有所帮助:

另一答案

当通过某些其他曲线逼近给定曲线时的典型约束是将近似曲线约束到原始曲线内的ε-软管(如果Circular approximation of polygon (or its part)具有固定半径epsilon的盘,则表示)。

对于具有biarcs的G1或C2连续近似(来自CNC / CAD的人)(并且直线段可以看作具有无限半径的弧),我的同事开发了一种算法,给出这样的解决方案[点击放大]:

Minkowski sum

以上图片来自项目网站:Sample solution

算法很快,也就是说,它在O(n log n)时间内运行,并且基于广义的Voronoi图。但是,它没有给出具有确切最小元素数的近似值。如果你寻找理论上的最优,我会参考Drysdale等人的论文,https://www.cosy.sbg.ac.at/~held/projects/apx/apx.html,CGTA,2008。

以上是关于近似具有有限数量的线段和圆弧的曲线的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用 cv2.approxPolyDP 来近似开放曲线?

计算机图形学输出图元_7_并行曲线算法

MFC 动态绘制直线,圆弧段(连续)如何实现

CAD修改鼠标捕捉模式

CAD修改鼠标捕捉模式

GLSL片段着色器 - 绘制简单的粗曲线