1

我需要确定二维贝塞尔曲线上的拐点(曲率变化的点),由t参数化,0 <= t <= 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处贝塞尔曲线的二阶导数的方法,但由于贝塞尔曲线是向量值函数,因此导数作为二维向量返回(不是 std::vector,二维向量类)。我不知道如何解释向量的“符号变化的地方”。基本上我不知道如何在上面的代码段中写 isNegative 或 isPositive 。

还有其他方法可以找到二维贝塞尔曲线上的拐点吗?

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

4

3 回答 3

2

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

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

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

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

于 2012-08-21T18:17:50.047 回答
1

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

这在本页和本文第 4页等各种来源中都有说明。

于 2012-09-17T18:31:51.773 回答
0

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

于 2012-07-13T10:50:34.633 回答