Skip to content

Bezier 曲线曲面绘制

Bernstein 基函数

在 Weierstrass 第一定理的构造性证明中,证明的关键是利用 Bernstein 基函数. 下面将介绍 Bernstein 基函数在计算几何中的应用,这类基函数具有“几何直观”的优良性质.

n 次多项式 Bernstein 基函数

Bin(t)=(in)ti(1t)ni,i=0,1,...,n

其中(in)=n!i!(ni)!,i=0,1,...,n.

举例:n=3时,三次 Bernstein 多项式为

B03(t)=(1t)3,B13(t)=3t(1t)2,B23(t)=3t2(1t),B33(t)=t3.

对应图形如图所示.

3次Bernstein基函数图形

基本性质

  • 非负性. Bin(t)0,t[0,1].
  • 单位分解性. i=0nBin(t)=(t+(1t))n=1.
  • 端点性质. 在端点t=0,t=1,分别只有一个 Bernstein 基函数取值为 1,其余全部为 0,即
Bin(0)={0,i0,1,i=0,Bin(1)={0,in.1,i=n,
  • 对称性. Bin(t)=Bnin(1t),i=0,1,...,n

  • 递推公式. 每一个 n 次 Bernstein 基函数可以由两个 n-1 次 Bernstein 基函数递推得到,即

    Bin(t)=(1t)Bin1(t)+tBi1n1(t),i=0,...,n.
  • 最大值. n1时,Bernstein 基函数Bin(t)t=in处取得唯一最大值.

  • 积分等值性. 所有 n 次 Bernstein 基函数在[0,1]上积分值相等.

01Bin(t)dt=1n+1,i=0,1,...,n.

Bezier 曲线

定义

称参数曲线段

P(t)=i=0nPiBin(t),t[0,1],

为一条 n 次Bezier 曲线,其中Bin(t)为 n 次 Bernstein 基函数,空间向量**PiR3称为控制顶点,依次用直线段连接相邻两个控制顶点得到的 n 边折线多边形称为控制多边形.**

实例代码

对于控制顶点

P0=(0,0),P1=(1,2),P2=(2,1),P3=(3,1)

平面上的三次 Bezier 曲线方程为

P(t)=i=03PiBin(t)=(3t,10t315t2+6t)
matlab
x=[0,1,2,3];
y=[0,2,-1,1];
n=length(x)-1;
xx=0;yy=0;
syms t
for k=0:n
    B=nchoosek(n,k)*t^k*(1-t)^(n-k);
    xx=xx+x(k+1)*B;
    yy=yy+y(k+1)*B;
end
xx=collect(xx);
yy=collect(yy);
fprintf('三次Bezier曲线方程为:x(t)=%s,y(t)=%s\n',xx,yy);
t1=linspace(0,1);
xx1=subs(xx,t,t1);
yy1=subs(yy,t,t1);
figure();
plot(x,y,'g*','markersize',10);
line(x,y,'color',[0 0 1])
hold on
plot(xx1,yy1,'r-')
hold off

控制顶点用绿色*标注,控制多边形设置为蓝色,Bezier 曲线为红色,结果如图所示.

张量积型 Bernstein 基函数

对 m 次与 n 次一元 Bernstein 基函数

{Bim(u)}i=0m,{Bjn(v)}j=0n,

张量积型m×n次二元 Bernstein 基函数为

Bi,jm,n(u,v)=Bim(u)Bjn(v),i=0,1,...,m,j=0,1,...,n.

(m+1)×(n+1)个多项式线性无关,从而构成二元多项式空间的一组基.

Bezier 曲面

定义

参数曲面

P(u,v)=i=0mj=0nPi,jBi,jm,n(u,v),(u,v)[0,1]×[0,1]

m×n次 Bezier 曲面,其中Bi,jm,n(u,v)为张量积型 Bernstein 基函数,空间向量Pi,jR3称为控制顶点i=0,1,...,m,j=0,1,...,n.依次用直线段连接同行同列相邻两个控制顶点得到m×n边折线网格称为控制网格.

实例代码

对于给定控制顶点

P0,0=(0,0,1),P0,1=(0,1,2),P0,2=(0,2,1),P1,0=(1,0,2),P1,1=(1,1,2.5),P1,2=(1,2,2),P2,0=(2,0,1),P2,1=(2,1,2),P2,2=(2,2,1).

绘制2×2次 Bezier 曲面

P(u,v)=i=02j=02Pi,jBi2(u)Bj2(v),(u,v)[0,1]×[0,1].
matlab
%控制顶点
Px=[0,0,0;1,1,1;2,2,2];
Py=[0,1,2;0,1,2;0,1,2];
Pz=[1,2,1;2,2.5,2;1,2,1];
figure();
plot3(Px,Py,Pz,'r','linewidth',2);
hold on
plot3(Px',Py',Pz','r','linewidth',2);
hold on
plot3(Px,Py,Pz,'g.','markersize',20,'linewidth',2);
hold on
a=0;b=1;
N=10;M=10;
hx=(b-a)/N;
hy=(b-a)/M;
x=(a:hx:b)';
y=(a:hy:b)';
n=2;m=2;
[x,y]=meshgrid(x,y);
PX=zeros(N+1,M+1);
PY=zeros(N+1,M+1);
PZ=zeros(N+1,M+1);
for i=1:n+1
    for j=1:m+1
        PX=PX+Px(i,j)*nchoosek(n,i-1).*(x.^(i-1)).*((1-x).^(n-i+1)).*nchoosek(n,j-1).*(y.^(j-1)).*((1-y).^(n-j+1));
        PY=PY+Py(i,j)*nchoosek(n,i-1).*(x.^(i-1)).*((1-x).^(n-i+1)).*nchoosek(n,j-1).*(y.^(j-1)).*((1-y).^(n-j+1));
        PZ=PZ+Pz(i,j)*nchoosek(n,i-1).*(x.^(i-1)).*((1-x).^(n-i+1)).*nchoosek(n,j-1).*(y.^(j-1)).*((1-y).^(n-j+1));
    end
end
surf(PX,PY,PZ)

控制顶点用绿色点标注,控制网格设置为红色,结果如图所示.

5-2

常备不懈,才能有备无患