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

时间:2010-07-12 04:21:04

标签: c++ c algorithm graphics vector

我正在寻找一种方法让我的应用程序在徒手模式下产生更平滑的结果。现在它只是添加每个鼠标移动点并使其成为多边形。我注意到现代矢量应用程序产生贝塞尔曲线,使它看起来更平滑,我想知道如何做到这一点?那么如何通过粗糙的用户输入平滑曲线来获得4个点进行贝塞尔插值?

由于

4 个答案:

答案 0 :(得分:0)

只有当你距离上一点有一定的距离阈值时才能存储一个新点?

答案 1 :(得分:0)

像ransac(参见Ransac)这样的东西可能会很好用。 Ransac同时找到解决方案,同时消除异常值。当从一小部分数据生成假设并且易于针对整个集合检验假设时,Ransac是好的。这非常适合您的问题。

基本理念:
循环:

  1. 从整套中随机挑选少量点以创建贝塞尔曲线。
  2. 为每个点计算到该曲线的距离。
  3. 消除超过某个阈值的点。
  4. <见下文>
  5. 将得分的剩余点的平方距离相加。
  6. 保持最佳分数的解决方案。
  7. 要使这个真正的ransac,您需要找到一个解决原始问题的函数4。 D'哦。也就是说,您需要能够根据步骤3中未消除的所有点计算曲线。这就是我提出上述建议的原因。它既快速又简单,可能会让你非常接近,特别是因为你真的没有粗略的异常值。

答案 2 :(得分:0)

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

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

诀窍是计算LM的渐变和粗糙度。你可以用数字方式做到这一点,而无需计算任何数学。使用numerical differentiation计算用于查找渐变的雅可比行列式(J)。 (雅各比也用LM来逼近Hessian。)

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

答案 3 :(得分:0)

您也可以使用平滑样条曲线。如果您对GPL没事,请查看GSL http://www.gnu.org/software/gsl/以了解实现。