用贝塞尔曲线的简短列表近似点列表

Approximate a list of points with a short list of Bézier curves

我有一个 (x, y) 点的列表。我知道如何制作通过所有这些点并具有连续的一阶(和二阶,虽然不太重要)导数的贝塞尔曲线列表。但是,我最终得到的列表太长了。如果它能让我减少我拥有的曲线数量,我宁愿近似我拥有的点。我希望能够传递一个参数,即我得到的近似值的接近程度或最大曲线数,最好是前者。

我想要这个的原因是最终结果将有一个图形 UI 用户可以在其中编辑贝塞尔曲线,并且曲线准确地通过每个点并不重要,只要他们很亲密。曲线越多越难编辑。

编辑: 有关此目的的更多信息。我正在尝试制作图像编辑软件。当有人加载位图时,我希望能够追踪中心线。 Potrace 是我用来描绘形状轮廓的工具,但它不适用于描绘笔触。我已经能够识别沿中心线的许多点,并且我想将这些数据转换为连接的贝塞尔曲线列表。我不想制作贝塞尔样条的原因是控制点太多,难以编辑。 "Too many" 不是一个容易定义的术语,但我希望能够传递一个参数来限制曲线的数量。根据最大曲线数最小化曲线与点的距离的函数,或者根据与点的最大偏差最小化曲线数的函数。

有几种方法可以实现您想要做的事情:

1) 使用RDP算法减少点数,然后创建通过剩余点的贝塞尔曲线列表。

2) 使用曲线拟合算法(如Schneider算法)产生多条贝塞尔曲线,并以G1(切线)连续性连接。在 link.

中查看 Schneider 算法的实现

3) 使用最小二乘拟合和 B 样条曲线生成单个 B 样条曲线。

从实现的角度来看,方法 1 对您来说可能是最简单的方法,因为您已经知道如何创建插入点列表的贝塞尔曲线。方法 3 实施起来要困难得多,您可能必须将 B 样条曲线转换为贝塞尔曲线,以便在 UI 级别使用它们。详细讨论请参考此