Bezier曲线

发布于:2023-01-20 ⋅ 阅读:(659) ⋅ 点赞:(0)

1.背景

给定n+1个数据点,p_0(x_0,y_0),...p_n(x_n,y_n),生成一条曲线,使得该曲线与这些点所描述的形状相符

2.思想

当用曲线段拟合曲线F(x),可以把曲线表示为许多小线段\Phi _i(x)之和,其中\Phi _i(x)

称为基函数 

f(x)=\sum_{i=0}^{n}a_i\phi _i(x)

一般选择多项式作为基函数

\phi _x=a_nx^n+...+a_1x+a_0

3.Bezier曲线

贝塞尔把参数n次曲线表示为:

p(t)=\sum_{i=0}^{n}a_if_{i,n}(t) \ \ 0\leq t\leq 1

其中系数矢量a_i(i=0,1,...,n)顺序首尾相接

基函数的详细表达式: (比较复杂)

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

施法中推导了bezier基函数的来源

剑桥博士Forrest证明了该基函数可以简化成伯恩斯坦基函数

由此贝塞尔曲线定义为:

给定空间n+1个点的位置矢量Pi(i=0,1,2,...,n),则Bezier曲线段的参数方程表示如下

p(t)=\sum_{i=0}^{n}p_iB_{i,n}(t) \ \ 0\leq t\leq 1

 其中Pi(Xi,Yi,Zi)(i=0,1,2,...,n)是控制多边形的n+1个顶点,即构成曲线的特征多边形,Bi,n(t)是伯恩斯坦基函数Bernstein基函数,有如下形式:

B_{i,n}(t)=\frac{n!}{i!(n-i)!}t^i(1-t)^{n-i}=C_{n}^{i}t^i(1-t)^{n-i}\ \ \ (i=0,1,...,n)

形如:二项式定理,又称为牛顿二项式定理。该定理给出了两个数之和的整数次幂的恒等式。

\sum_{i=0}^{n}B_{i,n}(t) 恰好是二项式{[t+(1-t)]}^n 的展开式

注意:当i=0,t=0时,t^i=1,\ i!=1

于是

Pi代表空间的很多点,t在0到1之间,把t带进去可以计算出一个数--即平面或空间的一个点

随着t值的变化,点也在变化,当t从0变到1时,就得到空间真的一个图像,这个图像就是Bezier曲线

4.一次Bezier曲线

p(t)=\sum_{i=0}^{n}p_iB_{i,n}(t) \ \ 0\leq t\leq 1

当n=1时,有两个控制点P0和P1,Bezier多项式是一次多项式

把你n=0和n=1带入伯恩斯坦基函数得到

B_{0,1}(t)=(1-t)

B_{1,1}(t)=t

得到一次Bezier曲线

p(t)=(1-t)p_0+tp_1

恰好是两个端点的直线参数方程

5.二次Bezier曲线

 p(t)=\sum_{i=0}^{n}p_iB_{i,n}(t) \ \ 0\leq t\leq 1

当n=2时,有3个控制点P0,P1和P2,Bezier多项式是二次多项式:

把你n=0,n=1和n=2带入伯恩斯坦基函数得到 

B_{0,2}(t)=(1-t)^2

B_{1,2}(t)=2t(1-t)

B_{2,2}=t^2

p(t)=(1-t)^2p_0+2t(1-t)p_1+t^2p_2=(p_2-2p_1+p_0)t^2+2(p_1-p_0)t+p_0

二次Bezier曲线为抛物线,其矩阵形式为:

p(t)=\begin{bmatrix} t^2 & t & 1 \end{bmatrix} \cdot \begin{bmatrix} 1 & -2 & 1\\ -2& 2 &0 \\ 1& 0 &0 \end{bmatrix}\cdot \begin{bmatrix} p_0\\ p_1\\ p_2 \end{bmatrix}

 6.三次Bezier曲线

当n=3时,有4个控制点P0,P1,P2和P3,Bezier多项式是三次多项式:

  p(t)=\sum_{i=0}^{n}p_iB_{i,n}(t) \ \ 0\leq t\leq 1

把你n=0,n=1,n=2和n=3带入伯恩斯坦基函数得到 

\begin{matrix} B_{0,3}(t)=(1-t)^3 \\ B_{1,3}(t)=3t(1-t)^2\\ B_{2,3}(t)=3t^2(1-t)\\ B_{3,3}(t)=t^3 \end{matrix}

p(t)=\sum_{i=0}^{3}P_iB_{i,3}(t)=(1-t)^3P_0+3t(1-t)^2P_0+3t^2(1-t)P_2+t^3P_3

 注意:

图中每个基函数在参数t的整个(0,1)的开区间都不为0,意味着每个基函数每时每刻均参与整个函数的构建,因此如果改变任一控制点,该控制点对应的基函数就会变化,这样整条曲线都会变化,因此Bezier曲线不能单独调整局部曲线。

把Bezier三次曲线多项式写成矩阵形式

p(t)=\begin{bmatrix} t^3 &t^2 & t & 1 \end{bmatrix} \cdot \begin{bmatrix} -1 & 3 & -3 & 1\\ 3& -6 &3 & 0\\ -3& 3 &0 & 0\\ 1& 0 &0 & 0\end{bmatrix}\cdot \begin{bmatrix} p_0\\ p_1\\ p_2\\ p_3 \end{bmatrix}=T\cdot M_{be}\cdot G_{be}\ \ \ \ \ \ \ t\in [0,1]

其中,Mbe是三次Bezier曲线系数矩阵,为常数,Gbe是4个控制点位置矢量。

7.Besizer曲线性质

1.端点性质

 曲线过始末端点

2.一阶导数

 Bezier曲线的起点和终点处的切线方向和特征多边形的第一条边和最后一条边的走向一致

3.几何不变性

8.Bezier曲线的生成

主要有两种方法

1.根据定义直接生成 

        1)首先给出C_{n}^{i}的递归计算器

                C_{n}^{i}=\frac{n-i+1}{i}C_{n}^{i-1}

        2)表示成坐标分量的形式

                \begin{matrix} x(t)=\sum_{i=0}^{n}x_iB_{i,n}(t)\\ y(t)=\sum_{i=0}^{n}y_iB_{i,n}(t)\\ z(t)=\sum_{i=0}^{n}z_iB_{i,n}(t) \end{matrix}\ \ \ \ \ \ \ \ \ t\in [0,1]

问题:求排列组合稍显麻烦

2.递推算法

        

Bezier曲线上的一个点p(t),都是其他相邻线段的同等比例(t)点处的连线,再取同等比例(t)的点再连线,一直取到最后那条线段的同等比例(t)处,该点就是Bezier曲线上的点P(t)。

 以此类推

由(n+1)个控制点pi(i=0,1...n)定义的n次Bezier曲线p_{0}^{n}可以被定义为分别由前、后n个控制点定义的两条(n-1)次Bezier曲线P_{0}^{n-1}P_{1}^{n-1}的线性组合。

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

 得到Bezier曲线的递推计算公式

P_{0}^{n}=\left\{\begin{matrix} P_i & k=0 \\ (1-t)P_{i}^{k-1}+tP_{i+1}^{k-1} & k=1,2...,n,i=0,1...,n-k \end{matrix}\right.

9.Bezier曲线的拼接

对于控制点过多的情况,需要解高阶次的方程,因此一般选择低阶的Bezier曲线拼接而成。

一般采用分段设计,然后将各段曲线相互连接起来,并保证结合处的几何连续。

        1)G^0连续

                P_n=Q_0

        2)G^1连续

                保证P_{n-1},P_n=Q_0,Q_1 三点共线

10.Bezier曲线的降阶和升阶

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到