Math 用一个简短的Bé列表近似点列表;齐尔曲线

Math 用一个简短的Bé列表近似点列表;齐尔曲线,math,graphics,geometry,bezier,approximation,Math,Graphics,Geometry,Bezier,Approximation,我有一个(x,y)点列表。我知道如何制作一个Bézier曲线列表,这些曲线通过所有这些点,并具有连续的一阶(和二阶,尽管不太重要)导数。然而,我最终得到的清单太长了。如果它能让我减少曲线的数量,我更愿意近似我拥有的点。我希望能够传递一个参数,要么是我得到的近似值有多接近,要么是曲线的最大数量,最好是前者 我希望这样做的原因是,最终结果将有一个图形用户界面,用户可以在其中编辑贝塞尔曲线,曲线准确通过每个点并不重要,只要它们很接近。曲线越多,编辑就越困难 编辑: 关于此目的的更多信息。我正在尝试制作

我有一个
(x,y)
点列表。我知道如何制作一个Bézier曲线列表,这些曲线通过所有这些点,并具有连续的一阶(和二阶,尽管不太重要)导数。然而,我最终得到的清单太长了。如果它能让我减少曲线的数量,我更愿意近似我拥有的点。我希望能够传递一个参数,要么是我得到的近似值有多接近,要么是曲线的最大数量,最好是前者

我希望这样做的原因是,最终结果将有一个图形用户界面,用户可以在其中编辑贝塞尔曲线,曲线准确通过每个点并不重要,只要它们很接近。曲线越多,编辑就越困难

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

有几种方法可实现您的目标:

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

2) 使用曲线拟合算法(例如,Schneider算法)生成多条与G1(切线)连续性相连的Bezier曲线。请查看本文中的Schneider算法实现

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


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

看起来这可能是一个很好的解决方案。它必须是单独的贝塞尔曲线吗?否则,你只是在寻找样条拟合。这是一个相当广泛的问题-你有一些具体的细节,你在做什么?这个列表代表什么?具体来说,为什么需要贝塞尔曲线?“太长”是什么意思?如果这些点可以是近似值,那么保留它们的哪些方面是重要的?等等,@NicoSchertler,样条曲线拟合的问题是曲线太多了,因为我只有一条曲线比点数少。样条曲线更一般。也可以使用近似点的样条曲线(即,它不一定通过所有点)。可以指定段的阶数(即连续性)和段数。我假设您将后者称为曲线数。