白泽图

  • 文章
    • Unity渲染
    • Unity项目开发
    • 工具
    • 数学
    • 算法
    • 网站搭建
    • 网络&操作系统
蒋程个人博客
互联网技术经验总结&分享
  1. 首页
  2. Unity渲染
  3. 正文

贝塞尔曲线与伯恩斯坦多项式

2020-11-13 1566点热度 1人点赞 0条评论

做U3D的时候,我们经常使用贝塞尔曲线,比如我们将一个元素从左边移动到右边,但是我们又不想让它匀速的移动,因为那样看上去会很死板,这个时候我们就可以使用一个事先调整好的贝塞尔曲线来表示速度的变化,或者我们想让一个元素按一个特定的曲线轨迹移动,我们也会用到它,在图形学中,贝塞尔曲线也是学习其他复杂曲线以及曲面的基础,所以有必要搞懂原理

我们先从二阶贝塞尔曲线分析:


  上图中有三个顶点,分别是P0,P1,P2, 我们通过这三个顶点可以获得一条唯一的贝塞尔曲线,该贝塞尔曲线从P0开始,到P1结束

现在我们解释这条贝塞尔曲线是怎么形成的

1.定义一个变量t,并使将t控制在0到1之间  (0≤ t ≤1)

2.连接P0与P1,并指定方向为P0->P1

3.连接P1与P2,并指定方向为P1->P2

4.当t为0到1之间的某个值时

   从P0->P1的直线上用t做为比例取点P0_1

   从P1->P2的直线上用t做为比例取点P1_1

5.连接P0_1与P1_1,并指定方向为P0_1->P1_1

6.从P0_1->P1_1的直线上用t做为比例取点P0_2

此时我们获得了t在图中对应的唯一点P0_2,那么如果我们将t在0~1的所有值都取其对应的唯一点,那么这些点就形成了一条贝塞尔曲线,如图:


这就是为什么前面我们说P0,P1,P2只会生成一条唯一的贝塞尔曲线,当然我们还要满足一个前提(该曲线必须从P0开始到P2结束,也就是方向必须是P0->P1,  P1->2)


那如果换成四个顶点,我们如何获得这四个顶点形成的唯一贝塞尔曲线呢?


这里其实光看图也能看明白了

1.定义一个变量t,并使将t控制在0到1之间  (0<=t <= 1)

2.连接P0与P1,并指定方向为P0->P1

3.连接P1与P2,并指定方向为P1->P2

4.连接P2与P3,并指定方向为P2->P3

4.当t为0到1之间的某个值时

   从P0->P1的直线上用t做为比例取点P0_1

   从P1->P2的直线上用t做为比例取点P1_1

   从P2->P3的直线上用t做为比例取点P2_1

5.连接P0_1与P1_1,并指定方向为P0_1->P1_1

6.连接P1_1与P2_1,并指定方向为P1_1->P2_1

7.从P0_1->P1_1的直线上用t做为比例取点P0_2

8.从P1_1->P2_1的直线上用t做为比例取点P1_2

最后

5.连接P0_2与P1_2,并指定方向为P0_2->P1_2

6.从P0_2->P1_2的直线上用t做为比例取点P0_3

同样

此时我们获得了t在图中对应的唯一点P0_3,那么如果我们将t在0~1的所有值都取其对应的唯一点,那么这些点就形成了一条贝塞尔曲线,如图:

至此我们已经知道贝塞尔曲线形成原理,至于后面的五个顶点,6个顶点形成的贝塞尔曲线同理推即可

不过我们通常不用xx个项点来形容一个贝塞尔权限,而是n阶贝塞尔

这个“阶”的概念其实也很好理解,如果站在程序的角度,大家一眼就能看出来这其实就是一个递归函数求t的对应值,不过3个顶点需要递归两层,4个顶点需要递归三层,那么每一层就是一阶,所以我们可以分别称上面的两个贝塞尔曲线为2阶贝塞尔曲线与3阶贝塞尔曲线

所以n阶贝塞尔曲线是由n+1个顶点形成的


下面我们用数学公式来尝试表示贝塞尔曲线

我们还是从最简单的二阶贝塞尔开始


P0_1 = (1-t)P0 + tP1     (当t=0时,P0_1=P0,当t=1时,P0_1=P1)

P1_1 = (1-t)P1 + tP2     (当t=0时,P1_1=P1,当t=1时,P1_1=P2)

P0_2=(1-t)P0_1 + tP1_1

      =(1-t) ((1-t)P0 + tP1) + t((1-t)P1 + tP2)

      =(1-t)2P0 + (1-t)tP1 + (1-t)tP1 + t2P2

      =(1-t)2P0 + 2(1-t)tP1 +  t2P2

此时仔细观察这个公式:我们暂时忽略各项上P0,P1,  P2,并将1-t 看成一个变量S,那么我们看到的是  S2+2St+t2     也这就是 二项式  (S+t)2  的展开式

我们继续使用相同的方法求3阶贝塞尔中的P0_3,我们可以得到S3+3S2t+3St2+t3  是二项式 (S+t)3的展开式

那也就是说P0_n = S与t的展开式的每一项分别乘上Pi 的求和公式  (i代表第i项,Pi代表第i个项点)

我们知道二项式展开的通项公式是:

那P0_n的每一项就是

     

合起来就是

  (0≤ r ≤n  , 0≤ t ≤1)

这个式子就是我们通常所说的伯恩斯坦(bernstein)多项式,事实上bernstein多项式是用来证明weierstrass定理,即一个连续的函数可以使用多项式逼近,并给出构造公式,本文反推也从另一角度证明了该命题

另外有了这个式子,我们就可以用一个for循环求出t在某一处对应的点,这个点也可以是三维空间中的点,这样我也就可以画出一个三维空间中的贝塞尔曲线

标签: 暂无
最后更新:2020-11-13

蒋程

这个人很懒,什么都没留下

点赞
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2023 白泽图. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

登录
注册|忘记密码?