Bézier Curve

目录

1. Bézier Curve

2.求贝塞尔曲线上的点坐标

3. 分段 Cubic Bézier Curve (Piecewise Cubic Bézier Curve)


1. Bézier Curve

        贝塞尔曲线于 1962 年,由法国工程师皮埃尔·贝济埃(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。

        贝塞尔曲线主要用于二维图形应用程序中的数学曲线,曲线由起始点,终止点(也称锚点)和控制点组成,通过调整控制点,通过一定方式绘制的贝塞尔曲线形状会发生变化。

贝塞尔曲线根据控制点的数量分为:

  • 一阶贝塞尔曲线(2 个控制点)
  • 二阶贝塞尔曲线(3 个控制点)
  • 三阶贝塞尔曲线(4 个控制点)
  • n阶贝塞尔曲线(n+1个控制点)

下图为一个三阶的贝塞尔曲线,包括四个控制点,分别为P_{0},P_{1},P_{2},P_{3}

                                                        

通过上图的三阶贝塞尔曲线举例,基本的步骤如下:

  •   四个控制点通过先后顺序进行连接,形成了三条线段,也就是上图中的P_{0}P_{1},P_{1}P_{2},P_{2}P_{3},然后通过一个参数t,其中,该参数的值等于线段上某一个点距离起点的长度除以线段长度。就比如P_{0}P_{1}线段上有一个点P_{0}',此时t的值就是\frac{P_{0}P_{0}'}{P_{0}P_{1}},其中P_{0}'位置如下图所示
  • 接下来对每一条线段做同样的操作,得到三个控制点P_{0}',P_{1}',P_{2}',如下图所示。   

                                                             

  • 然后对这三个控制点重复第1步操作,得出两个控制点P_{0}'',P_{1}'',如下图所示。 

                                                           

  • 最后再使用同样的方法可以得到,最终的一个点P_{0}''',如下图所示,此时这个点就是贝塞尔曲线上的一个点。

   通过控制t的值,由 0 增加至 1,就绘制出了一条由起点P_{0}至终点P_{3}的贝塞尔曲线。

                                                                

2.求贝塞尔曲线上的点坐标

  • 一阶贝塞尔曲线

                                                       ​

 对于一阶贝塞尔曲线,我们可以通过几何知识,很容易根据t的值得出线段上那个点的坐标:

                                                                B_{1}(t) = P_{0}+(P_{1}-P_{0})t

   即:

                                                            B_{1}(t) =(1-t) P_{0}+tP_{1},t\in[0,1]

  •  二阶贝塞尔曲线                                  

                                                              ​

    对于二阶贝塞尔曲线,其实你可以理解为:在P_{0}P_{1}上利用一阶公式求出点P_{0}',然后在P_{1}P_{2}上利用一阶公式求出点P_{1}',最后在P_{0}'P_{1}'上再利用一阶公式就可以求出最终贝塞尔曲线上的点P_{0}''。具体推导过程如下:

    先求出线段上的控制点:

                                                                     P_{0}'=(1-t)P_{0}+tP_{1}

                                                                      P_{1}'=(1-t)P_{1}+tP_{2}

    将上面的公式带入至下列公式中:

                                                                  B_{2}(t)=(1-t)P_{0}'+tP_{1}'

    得:

                                  B_{2}(t)=(1-t)P_{0}'+tP_{1}'=(1-t)^2P_{0}+2t(1-t)P_{1}+t^2P_{2}

  • 三阶贝塞尔曲线

                                                               

     与二阶贝塞尔曲线类似,可以通过相同的方法得出以下坐标公式:

                               B_{3}(t)=(1-t)^3P_{0}+3t(1-t)^2P_{1}+3t^2(1-t)P_{2}+t^3P_{3},t\in[0,1]

  • 多阶贝塞尔曲线

      n阶贝塞尔曲线公式:

                                                  B(t) = \sum_{i=0}^{n}C_{n}^{i}P_{i}(1-t)^{n-i}t^i,t\in[0,1]

3. 分段 Cubic Bézier Curve (Piecewise Cubic Bézier Curve)

    思路: G2 连续 Piecewise Cubic Bézier Curve 拟合离散点,端点不变,控制曲线形状的点需要重构。

    分段三阶贝塞尔曲线可以表示为:

                                   n-Bezier\left\{\begin{matrix} B_{0}(t)& [P_{0,0}- P_{3,0}]\\ B_{1}(t)& [P_{0,1}- P_{3,1}]\\ \vdots & \vdots\\ B_{n-1}(t) &[P_{0,n-1}- P_{3,n-1}] \end{matrix}\right.

    三阶贝塞尔曲线: B(t)=(1-t)^3P_{0}+3t(1-t)^2P_{1}+3t^2(1-t)P_{2}+t^3P_{3},t\in[0,1]

    上述表示中: P_{0},P_{3} 为端点,P_{1},P_{2}为控制曲线形状的点(曲线不经过)。

    曲线的一阶微分:B'(t)=-3(1-t)^2P_{0}+3(1-4t+3t^2)P_{1}+3(2t-3t^2)P_{2}+3t^2P_{3},t\in[0,1]

    分段曲线在边界上一阶连续: 

                              B_{i}'(0)=B_{i-1}'(1)  或者3P_{0,i}+3P_{1,i}=-3P_{2,i-1}+3P_{3,i-1}                (结论1)

    因为分段曲线0阶连续,所以P_{0,i}=P_{3,i-1} = K_{i},结论1可以简可以化为

                                                   2K_{i}=P_{2,i-1}+P_{1,i}, i\in[0,n-1]                                          (结论2)

    曲线的二阶微分:B''(t)=6(1-t)P_{0}+3(-4+6t)P_{1}+3(2-6t)P_{2}+6tP_{3},t\in[0,1]

    分段曲线在边界上二阶连续: 

                              6 {P}_{0,i}-12{P}_{1,i}+6{P}_{2,i}=6{P}_{1,i-1}-12{P}_{2,i-1}+6{P}_{3,i-1}  

                                            -2{P}_{1,i}+{P}_{2,i}={P}_{1,i-1}-2{P}_{2,i-1}                                                   (结论3)

    结合结论2和结论3,可以发现所有的索引共计n-1 , 有2(n-1)个方程,但我们有2n个未知数,所以我们需要添加边界条件,以自然边界B''_{0}=0,B''_{n-1}=0为例:

                                          {K}_0-2{P}_{1,0}+{P}_{2,0}=0   --(结论2)--->    2{P}_{1,0}+{P}_{1,1}={K}_0+2{K}_1                                         

                                                      2{P}_{1,n-2}+7{P}_{1,n-1} = 8{K}_{n-1}+{K}_n                                      (结论4)

    将结论2带入结论3得到:

                                       {P}_{1,i-1}+4{P}_{1,i}+{P}_{1,i+1}=4{K}_i+2{K}_{i+1} , i\in[1,n-2]              (结论5)

     结合结论4和5共计n个方程,n个未知数,求出所有的{P}_{1,i},接着套用下面公式求出 {P}_{2,i}

                                                     {P}_{2,i}=2{K}_{i}-{P}_{1,i}, i\in [0,n-2]                                         

                                                       {P}_{2,n-1}= (1/2)({K}_n+{P}_{1,n-1})   

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值