【Computer Graphics】曲线:贝塞尔曲线

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LeeXxs/article/details/84838326

内容

  1. 简介
  2. 线性贝塞尔曲线
  3. 二次贝塞尔曲线
  4. 三次贝塞尔曲线
  5. N阶贝塞尔曲线

1. 简介

最近学习了一下贝塞尔曲线,第一次get到了数学之美。-->维基百科传送门

贝塞尔曲线作为计算机图形学中一个十分重要的参数曲线被广泛运用,例如Unity中的曲线编辑器,Photoshop中的钢笔工具,甚至可以模拟物体运动轨迹和用于几何体的绘制。


2. 线性贝塞尔曲线

当只给定两个点 P0 和 P1 时,贝塞尔曲线其实是一条直线,下面是线性贝塞尔曲线的公式:

线性贝塞尔曲线公式同直线表达式是一样的,根据下图可以看到,随着 t 的变化,点由 P0 滑向 P1 。

线性贝塞尔曲线演示动画,t在[0,1]区间

3. 二次贝塞尔曲线

二次贝塞尔的路径通过给定点P0、P1、P2,由以下函数 \small B(t) 追踪,一般不会经过P1:

为建构二次贝塞尔曲线,可以以中介点Q0和Q1作为由0至1的t

  • P0至P1的连续点Q0,描述一条线性贝塞尔曲线。
  • P1至P2的连续点Q1,描述一条线性贝塞尔曲线。
  • Q0至Q1的连续点B(t),描述一条二次贝塞尔曲线。
二次贝塞尔曲线的结构
二次贝塞尔曲线演示动画,t在[0,1]区间 

4. 三次贝塞尔曲线

P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝塞尔曲线。

曲线起始于P0走向P1,并从P2的方向来到P3。一般不会经过P1或P2;这两个点只是在那里提供方向资讯。P0和P1之间的间距,决定了曲线在转而趋进P2之前,走向P1方向的“长度有多长”。

曲线的参数形式为:

对于三次曲线,可由线性贝塞尔曲线描述的中介点Q0、Q1、Q2,和由二次曲线描述的点R0、R1所建构:

  • P0至P1的连续点Q0,描述一条线性贝塞尔曲线。
  • P1至P2的连续点Q1,描述一条线性贝塞尔曲线。
  • P2至P3的连续点Q3,描述一条线性贝塞尔曲线。
  • Q0至Q1的连续点R0,描述一条二次贝塞尔曲线。
  • Q1至Q2的连续点R1,描述一条二次贝塞尔曲线。
  • R0至R1的连续点B(t),描述一条三次贝塞尔曲线。
三次贝塞尔曲线的结构
三次贝塞尔曲线演示动画,t在[0,1]区间

5. N阶贝塞尔曲线

根据上述几个低阶的贝塞尔曲线公式,可以推导出更高阶以及任意阶的公式:

  • 给定两个点 P0 和 P1,分别为起点和终点,构建线性贝塞尔曲线公式:

B(t) = P_0(1-t) + P_1t

当 t 由0变化到1时,B(t) 的值其实是在 P0 和 P1 两点之间做的线性插值,当t=0时,B(t)=P0,当t=1时,B(t)=P1:


  • 对于二次贝塞尔曲线,除了起点 P0 和终点 P1,还指定了控制点 Q0,连接三个点:

直线 P0Q0 和直线 Q0P1 的函数分别为:

P_0_Q(t) = P_0(1-t) + Q_0 t

P_Q_1(t) = Q_0(1-t) + P_1 t

下面是二次的贝塞尔曲线的推导过程:

首先,如果是以 P0 为起点和以 P1 为终点的线性贝塞尔曲线,其公式为两点的插值:P(t) = P_0(1-t) + P_1 t,可以理解为 P0 和 P1 在t时刻对于位置 P(t) 影响的大小,t 越靠近0,P0 对于 P(t) 的影响越大;

假设两条线 M(t),N(t),如果他们同时对点 P(t) 的位置有影响,当t越靠近0,M(t)影响越大,t越靠近1,N(t)影响越大,按照两点线性插值的方法对两条线进行插值,得到函数:

P(t) = M(t) * (1-t) + N(t) * t

如果把M(t)和N(t)替换成直线 P0Q0 和直线 Q0P1 的函数,就可以得到公式:

P(t) = (1-t)^{2} * P_0 + 2 t (1-t) * Q_0 + t^{2} * P_1

这样就得到了二次贝塞尔曲线的公式(t最高次项是二次),且 P(0) = P_0P(1) = P_1。可以将二次贝塞尔曲线公式理解为两个线性贝塞尔曲线的组合;


  • 然后是三次贝塞尔曲线,除起点 P0 和终点 P1,还需两个控制点 Q0,Q1:

类比可知,将三次贝塞尔曲线的四个点分为两组:[P_0,Q_0,Q_1] 和 [Q_0,Q_1,P_1],得到两个二次贝塞尔曲线方程:P_0(t) 和 P_1(t)

P_0(t) = (1-t)^{2} * P_0 + 2 t (1-t) * Q_0 + t^{2} * Q_1

P_1(t) = (1-t)^{2} * Q_0 + 2 t (1-t) * Q_1 + t^{2} * P_1

按照同样的思路,t越靠近0,P_0(t) 的影响越大,t越靠近1,P_1(t) 的影响越大:

P(t) = P_0(t) * (1-t) + P_1(t) * t

代入可得:

P(t) = (1-t)^{3} P_0 + 3t(1-t)^{2} Q_0 +3t^{2}(1-t) Q_1 + t^{3} P_1

这就是三次赛贝尔的方程,且 P(0) = P_0P(1) = P_1


  • 那么n阶的贝塞尔曲线可由如下递归的方式表达:

或者有:

其中 P_i 的系数的分布符合二项式系数-->维基百科传送门

综上,n阶贝塞尔曲线为:

​​​​

四次贝塞尔曲线演示动画,t在[0,1]区间
五次贝塞尔曲线演示动画,t在[0,1]区间

 

猜你喜欢

转载自blog.csdn.net/LeeXxs/article/details/84838326