c++ - 三次贝塞尔曲线 : What to do when leading coefficient is zero?

标签 c++ math bezier

我使用相当标准的方法从三次贝塞尔曲线的控制点检索一元多项式系数:

std::array<double, 3> getBezierCubicCoefficients( const std::array<double, 4>& bezier )
{
    const auto d = 1.0 / ( bezier[3] - 3*bezier[2] + 3*bezier[1] - bezier[0] );
    return { ( 3*bezier[2] - 6*bezier[1] + 3*bezier[0] ) * d,
             ( 3*bezier[1] - 3*bezier[0] ) * d,
             bezier[0] * d };
}

这在 99% 的情况下都可以正常工作,但正如您可能已经猜到的那样,在某些坐标下会失败,从而导致 d 的除数为零 - 导致 d计算结果为 Inf

我的问题是:这种情况下该怎么办?

我真的得到了变相的二次曲线吗?我应该执行降阶吗?我是否应该捏造数字,使 d 非常大,但不会导致 Infs? (我真的希望这不是答案)。

最佳答案

您可能已经知道,单项系数 c 可以通过贝塞尔系数乘以以下矩阵来计算:

                              / 1  -3   3  -1 \
                              |     3  -6   3 |
(c0 c1 c2 c3) = (b0 b1 b2 b3) |         3  -3 |
                              \ 0           1 /

如果结果 c3 = -b0 + 3b1 - 3b2 + b3 为零,那么您将得到一个二次多项式(最多)。在退化情况下,其他系数也可能产生 0。在极端情况下,您最终会得到一个常数。

关于c++ - 三次贝塞尔曲线 : What to do when leading coefficient is zero?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31791648/

相关文章:

c++ - Windows 堆管理器 - 前端和后端分配器

jQuery .each 循环与简单的数学不给出单独的结果

c++ - 缺少数字 面试问题 Redux

math - 编程和数学有什么关系?

opengl - 在OpenGL中绘制Hermite曲线

javascript - 使用javascript的贝塞尔曲线的长度

c++ - 使用 fork 在两个进程之间逐个字符地发送字符串

c++ - 关于 C++ 中的 sleep 命令

c# - 使用 C++ 中的引用从 C# 错误调用 C++ 代码

svg - 在SVG中用相对路径绘制贝塞尔曲线