贝塞尔曲线(Bezier Curve)

有兴趣的建议看这篇,比较新:https://zhuanlan.zhihu.com/p/366678047

曲线和曲面

在生活中存在着各种各样光滑的曲线或曲面,例如汽车的表面,钢珠球等。

在建模的时候,我们通常使用很多的小三角形来逼近这样的曲面,因此放大了看,就会发现这些面其实是凹凸不平的。但是实际生活中,例如我身边的杯子,无论怎么看它都是一个光滑的表面。

那么我们应该怎么表达这些光滑的曲线或曲面呢?我们先从曲线入手,看看它的几种表达方式。

 

曲线的显示表示(Explicit representation)

学过函数我们知道,y=x^2 画出来的图其实就是一条曲线,如下:

当然还有 y=x^3+k 等等函数,可以画出各式各样的曲线。这种 y=f(x) 的表达方式,我们称之为二维空间中,曲线的显示表示。即以自变量(x)来表达因变量(y)的值

 

曲线的隐式表示(Implicit representation)

隐式表示,就是利用隐式方程来刻画一条曲线,在二维空间中一个隐式的曲线可以通过 f(x,y)=0 来表达。例如圆的隐式方程即为:x^2+y^2-r^2=0 ,用它即可表示一个半径为 r 的圆。

 

曲线的参数形式表示(Parametric form)

该形式也是图形学里最关心和最常用的形式。一个曲线的参数形式是通过一个自变量(参数) t 来表达曲线上每个点的空间坐标。

在三维空间中,我们可以用如下三个显示的函数,来表示一条空间曲线。

  • x=x(t)
  • y=y(t)
  • z=z(t)

t=0即代表曲线的起点,t=1代表曲线的终点,因此可以用 t (0<=t<=1)代表曲线上的任意一点 P(t),然后将 t 的值带入三个显示的方程,即可求出曲线上点 P 的坐标,P(t) = (x(t), y(t), z(t)) 。

参数曲线并不是唯一的,一个给定的曲线或者曲面可以通过不同的形式表达。给定一个表达式我们可以画出一个唯一的曲线,但是该曲线可能还有别的表达式可以来表示。

参数形式有一个好处,例如上面的式子表达的是三维空间的曲线,如果我们删除了 z=z(t),那么它就变成了一个二维空间的曲线,即降维很方便。并且同样的也容易推广到高维,新增新维度对应的显示方程即可。

并且前面我们说了 t 的范围是 0-1,并且代表曲线上的一点,那么我们只需要将 t 的值慢慢从 0 变到 1 ,点就会沿着曲线行走,我们就可以得到曲线的轨迹,容易实现曲线的绘制。

此外我们还可以对每个点求导,即 \frac{dP(t)}{dt}=(\frac{dx(t)}{dt},\frac{dy(t)}{dt},\frac{dz(t)}{dt}),得到结果被视为曲线的绘制速度,该导数指向曲线的切向。

举个二维的例子,比方说我有一个 y=0.3x^2+1 的曲线,其中 x 的取值范围为 1-4,那么这个曲线如下图:

我们来看看怎么用参数的形式来表示,首先是 x 和 t 的关系,因为 x 是 1-4,而 t 是 0-1,因此我们可得到方程 x = 3t+1 。然后是 y,因为我们知道这个曲线是y=0.3x^2+1 的,因此我们把里面的 x 用 x=3t+1 来代替即可,得到 y=0.3(3t+1)^2+1=2.7t^2+1.8t+1.3。因此我们上诉曲线的参数形式即为:

  • x = 3t+1
  • y=2.7t^2+1.8t+1.3

通过带入不同的 t 值,即可得到该曲线各个点的坐标,例如 P(0)=(1, 1.3),P(1)=(4, 5.8)。

 

参数形式与多项式

我们曲线的参数形式写成一个多项式的形式。例如我们前面的二维例子,我们可以把它写成一个二阶的多项式,即 at^2+bt+c 的形式。但是其中a,b,c并不是常数,而是代表着向量,其结果为: P(t)=(0,2.7)t^2+(3,1.8)t+(1,1.3) 。

对于3阶多项式参数曲线具有如下形式:P(t)=at^3+bt^2+ct+d,它被称为Ferguson曲线,曾被用于美国早期的飞机设计中。

但是我们也可以发现,这种多项式的表达方式并不直观。而且 t 之前的系数也并不好算,即是给定了这些系数,也很难想象出曲线的形状。

因此后面就有了贝塞尔曲线。

 

贝塞尔曲线(Bezier Curve)

相比之前的几种曲线表示方法,贝塞尔提出的是一种通过连接向量(connected vectors)来表示曲线的方法,如下:

即在画曲线前先通过向量绘制一个多边形,代表该曲线的趋势和走向。就好比画画的时候先画个大致轮廓再画细节,雕刻的时候也是先雕个大致形状再慢慢打磨。并且贝塞尔曲线具有交互性,也就是说我们可以通过修改向量,来修改曲线。

贝塞尔提出了如下公式用于计算曲线,将曲线表达成向量和基函数的乘积。

V(t)=\sum_{i=0}^{n}f_{i,n}(t)A_i

其中 A_i 代表的就是向量,f_{i,n}(t) 代表的是一个基函数,其内容如下:

f_{i,n}(t)=\left\{\begin{matrix} 1 &&i=0\\ \frac{(-t)^i}{(i-1)!}\frac{d^{i-1}}{dt^{i-1}}\frac{(1-t)^{n-1}-1}{t} \end{matrix}\right.

注:该基函数本质上就是一个n-1次的多项式。

有了这个公式后,也就是说你给我一个多边形,我就可以用它算出一个曲线,从公式中我们也可发现,贝塞尔曲线属于一种参数形式表示曲线的方式

 

伯恩斯坦多项式

1972年,Forrest在Computer Aided Design杂志上发表了他的著名论文,在论文里他指出贝塞尔曲线可以借助伯恩斯坦多项式被定义在点集上

有关伯恩斯坦多项式的介绍可以参考:https://zhuanlan.zhihu.com/p/366082920

原本贝塞尔曲线说的是向量相连,我们现在把这向量都变成一个个控制点,即给定控制顶点 P_0,P_1,P_2...P_n ,贝塞尔曲线可以定义为:

P(t)=\sum_{i=0}^{n}P_iB_i^n(t)

其中的 B_i^n(t) 就是第 i 个 n 阶的伯

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值