找到2d贝塞尔曲线上的拐点

时间:2012-07-13 07:07:25

标签: c++ math bezier

我需要在2d Bezier曲线上确定拐点(曲率变化的点),参数化为 t ,0 <= t &lt; = 1 ,如果它们存在的话。我原来的方法是沿着曲线进行采样,评估二阶导数并找出导数符号发生变化的点。

2DVector curvature1, curvature2;
for (double t = 0, t <= 1.0; t += STEP) {
    curvature1 = bezier.CurvatureAt(t);
    curvature2 = bezier.CurvatureAt(t + (STEP/2.0 >= 1.0 ? 0 : t + STEP/2.0));
    if (isNegative(curvature1) ? isPositive(curvature2) : isNegative(curvature2)) {
        inflection_point = t;
    }
 }

其中CurvatureAt()是一种在 t 处评估贝塞尔曲线的二阶导数的方法,但由于贝塞尔曲线是矢量值函数,导数作为二维矢量返回(不是标准: :vector,2D矢量类)。我不知道如何解释&#34;标志改变的地方&#34;对于矢量。基本上我不知道如何在上面的代码片段中编写isNegative或isPositive。

还有其他方法可以在2d贝塞尔曲线上找到拐点吗?

我不认为有可能确定这个问题的封闭形式解决方案,因为Bezier可以是任意程度的,但是如果我错了,请纠正我。

3 个答案:

答案 0 :(得分:2)

曲率与二阶导数有关但不相同。

参数曲线P(t) = (x(t), y(t))的带符号曲率实际上是一个数字,定义为:

k(t) = (x'y'' - x''y') / (x' * x' + y' * y')^(3/2)

如果您使用此公式,您的原始想法应该有效。

答案 1 :(得分:1)

要确定贝塞尔曲线上的拐点,请在区间(0,1)[不包括当然的端点]中找到时间或时间,其中参数方程的一阶和二阶导数的叉积为bezier为零,即f'X f''= 0。

this pagethis paper的第4页等各种来源中都注明了这一点。

答案 2 :(得分:0)

我认为你不需要这样的循环。 根据{{​​3}},您可以在任何点计算贝塞尔曲线的曲率。由于贝塞尔曲线具有多项式表达式,因此可以轻松计算曲率符号何时发生变化。