了解无处可去的贝塞尔派生代码

Understanding Bezier derivation code that leads nowhere

提问人:Illari 提问时间:5/15/2022 更新时间:5/16/2022 访问量:113

问:

我正在尝试将计算法线的 Bezier.js 实现转换为 Shadertoy 程序,并且代码似乎不使用任何计算值。它也需要用于二次有理数。

我发现 Javascript 代码有点难以理解,所以我为我的 Shadertoy 程序简化了它:

vec2[3] derive(vec2[3] p)
{
    vec2[3] dpoints;
    int l_length = 0, j;
    for (int i = 2; i > 0; --i) {
      vec2[3] l;
      for (j = 0; j < i; j++) {
        vec2 dpt = vec2(
          float(i) * (p[j + 1].x - p[j].x),
          float(i) * (p[j + 1].y - p[j].y));
        dpoints[l_length] = dpt;
        l[l_length] = dpt; ++l_length;
      }
      p = l;
    }
    return dpoints;
}

Bezier.js 程序继续为 3d 贝塞尔添加功能,以防与理性贝塞尔有任何关系。

我需要理解程序的其余部分,因为我不知道计算法线的理论。

数学 图形 语言不可知贝 塞尔 导数

评论

1赞 Mike 'Pomax' Kamermans 5/15/2022
那么也许是时候阅读《贝塞尔曲线入门》了。在 2D 中,法线只是导数,旋转 90 度并归一化(但在 3D 中,事情更加复杂,如果你想要好看的法线,只有微积分无法让你到达那里)。获得贝塞尔曲线的导数函数非常容易,正如我们在引物中导数部分的末尾所看到的那样。
1赞 Dominik Mokriš 5/16/2022
你说的是什么类型?对我来说,这听起来像是一个由三个二维向量组成的数组,但这对代码的其余部分没有多大意义。vec2[3]
0赞 Spektre 5/18/2022
如果你抛弃你计算贝塞尔点的缓慢迭代方式,直接使用多项式,你就不会有推导它的问题,这将给你切线,在3D中,你与参考对齐方向(如相机向上)交叉乘积以获得法线......在 2D 中足以对切线进行交叉积(不要被糟糕的数学书弄脏,这些书说交叉积仅在 3D 中,因为它在 2D、3D、4D 中定义得很好......ND) 所以在 2D 中只需切换到切线......(x,y)(y,-x)

答:

0赞 Illari 5/16/2022 #1

大声拼出 Pomax 的答案:

仅使用最后的计算值,从原点制作“曲线”(直线)。

权重的计算公式为 w'0 = 2(w1-w0), w'1 = 2(w2-w1)。

得到的 t 处的贝塞尔给出了 t 处原始贝塞尔的正切值。

我希望我做对了,我还没有尝试过。