我有一个(x, y)
点列表。我知道如何制作Bézier曲线列表,这些曲线通过所有这些点并且具有连续的第一(和第二,但不太重要)导数。但是,我最终得到的列表太长了。如果它让我减少了我的曲线数量,我宁愿接近我所拥有的点数。我希望能够传递一个参数:我得到的近似值或最大曲线数,最好是前者。
我想要这个的原因是最终结果将有一个图形用户界面,用户可以编辑Bézier曲线,并且只要它们接近,曲线就完全通过每个点并不重要。更多曲线使编辑更加困难。
编辑: 有关此目的的更多信息。我正在尝试制作图像编辑软件。当有人加载位图时,我希望能够跟踪中心线。 Potrace是我用来追踪形状轮廓的东西,但它不适用于描绘笔划。我已经能够沿中心线识别出许多点,我想将这些数据转换为连接的Bézier曲线列表。我不想制作Bézier样条曲线的原因是,有太多的控制点可以轻松编辑。 “太多”不是一个易于定义的术语,但我希望能够传递一个参数来限制曲线的数量。基于最大曲线数量最小化曲线与点的距离的函数,或基于与点的最大偏差最小化曲线数量的函数。
答案 0 :(得分:1)
有几种方法可以实现您的目标:
1)使用RDP算法减少点数,然后创建通过剩余点的贝塞尔曲线列表。
2)使用曲线拟合算法(例如,Schneider算法)生成多条Bezier曲线,这些曲线与G1(切线)连续性相关联。查看此link中的Schneider算法实现。
3)使用带B样条的最小二乘拟合生成单个B样条曲线。
从实现的角度来看,方法1对您来说可能是最简单的方法,因为您已经知道如何创建插入点列表的贝塞尔曲线。方法3将更难实现,您可能必须将B样条曲线转换为贝塞尔曲线,以便在UI级别使用它们。有关详细讨论,请参阅此SO article。