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

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非常大,但不会导致Inf吗? (我真的希望这不是答案)。

最佳答案

您可能已经知道,可以通过与以下矩阵相乘从贝塞尔系数计算出单项系数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。在边缘情况下,您最终得到一个常数。

09-07 07:14