【问题标题】:Finding points of inflection on a 2d Bezier curve在二维贝塞尔曲线上寻找拐点
【发布时间】:2012-07-13 00:31:33
【问题描述】:

我需要确定二维贝塞尔曲线上的拐点(曲率变化的点),参数化为 t, 0 t

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,一个二维向量类)。我不知道如何解释向量的“符号变化的地方”。基本上我不知道如何在上面的 sn-p 中写 isNegative 或 isPositive。

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

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

【问题讨论】:

  • “拐点”是什么意思?一个明显的含义是“x 或 y 方向的最大范围”,但我可以想象其他人。这个问题会有一个数学答案(即封闭数学形式的答案),尽管在mathworld page 上没有一个明显的答案。如果您能找到它,那么该解决方案将比迭代解决方案更准确且计算速度更快。

标签: c++ math bezier


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    如果你使用这个公式,你最初的想法应该会奏效。

    【讨论】:

      【解决方案3】:

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

      这在this pagethis paper 的第4 页等各种来源中都有说明。

      【讨论】:

        猜你喜欢
        • 2011-08-21
        • 2016-06-24
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 2011-03-10
        • 2011-03-11
        • 1970-01-01
        相关资源
        最近更新 更多