c++ - 从粗糙点生成三次贝塞尔曲线

标签 c++ c algorithm graphics vector

我正在寻找一种方法让我的应用程序在手绘模式下产生更流畅的结果。现在它只是简单地添加每个 mousemove 点并从中创建一个多边形。我注意到现代 vector 应用程序会生成贝塞尔曲线,使其看起来更平滑,我想知道这是如何完成的?那么我怎样才能得到这 4 个点来使用平滑曲线的粗略用户输入进行贝塞尔插值呢?

谢谢

最佳答案

如果想解决一般问题,可以使用levenberg-marquardt (LM)优化。

您想用少量点定义一条贝塞尔曲线。您可以使用 LM 通过最小化所有点到曲线的平方距离来优化曲线参数(点位置)。这是您的目标函数,距离平方和。

诀窍是计算 LM 的梯度和 hessian。你可以用数字来做到这一点,而不必计算任何数学。使用 numerical differentiation计算用于查找梯度的 Jacobian (J)。 (雅可比也被 LM 用来逼近 Hessian。)

Matti 提到了用于平滑样条的 GSL。我不知道 GSL,但事实证明它有 LM 和数值微分的实现。

关于c++ - 从粗糙点生成三次贝塞尔曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3225851/

相关文章:

c++ - VS 2015 链接器错误,预编译 header

c - 再次使用 mmap() ,重新使用以前的 mmap() 结果失败 - 使原始 ptr 无效?

python - 生成所有可能的小键盘/小键盘序列

algorithm - 找到可能的不同非递减数组的总数

c++ - 条件运算符的局限性? :

c++ - new[]分配的内存大小

c++ - 如何更改cmake中创建的文件的路径?

C strtok() delim

c++ - 在 Linux 中使用 C++ 库 (eclipse)

c++ - 使用动态规划创建最大配置