张量积型的Bezier曲面

1. 张量积型的Bezier曲面的定义

       给定(m+1)(n+1)个空间向量 P i , j ∈ R 3 P_{i,j}\in{R^3} Pi,jR3 ( i = 0 , 1 , . . . , m , j = 0 , 1 , . . . , n ) (i = 0,1,...,m, j = 0,1, ... , n) (i=0,1,...,m,j=0,1,...,n) B i m ( u ) , B j n ( v ) B^{m}_{i}(u),B^{n}_{j}(v) Bim(u),Bjn(v)为Bernstein基函数。曲面
P ( u , v ) = ∑ i = 0 m ∑ j = 0 n B i m ( u ) B j n ( v ) , ( u , v ) ∈ [ 0 , 1 ] × [ 0 , 1 ] . P(u,v) = \sum^m_{i=0}\sum^n_{j=0}B^{m}_{i}(u)B^{n}_{j}(v) ,(u,v) \in [0,1] \times [0,1] . P(u,v)=i=0mj=0nBim(u)Bjn(v),(u,v)[0,1]×[0,1].
称为一个 m × n m \times n m×n 次Bezier曲面, P i , j P_{i,j} Pi,j称为控制顶点 . 依次用直线段连接同行同列相邻两个控制点所得的 m × n m \times n m×n 边折线网格称为 Bezier 网 (简称B网) 或者 控制网格

2. 编程示例

       以下是张量积型的Bezier曲面的简单编程 ,张量积型的Bezier曲面的性质的一些编程之后看小编水平吧!

function bezier_surf
%张量积型的bezier曲面
a = 0;
b = 1;
N = 10;
M = 10;
hx = (b-a)/N;
hy = (b-a)/M;
x = (a:hx:b)';                   %x:[0,1]区间N等分得到的向量
y = (a:hy:b)';                   %y:[0,1]区间M等分得到的向量
n = 2;
m = 2;
a = 0;
b = 1;
N = 10;
M = 10;
hx = (b-a)/N;
hy = (b-a)/M;
x = (a:hx:b)';                   %x:[0,1]区间N等分得到的向量
y = (a:hy:b)';                   %y:[0,1]区间M等分得到的向量
n = 2;
m = 2;
Px=[4,4,4;2,2,2;0,0,0];                 %给的坐标值
Py=[0,2,4;0,2,4;0,2,4];
Pz=[0,2,0;2,4,2;0,2,0];
% Py = [1,1,1;2,2,2;3,3,3];           %给的第二组坐标  
% Px = [1,2,3;1,2,3;1,2,3];
% Pz = [1,3,1;3,5,3;1,3,1];
plot3(Px,Py,Pz,'b','linewidth',1.2);hold on;
plot3(Px',Py',Pz','b','linewidth',1.2);hold on;
plot3(Px,Py,Pz,'mo','linewidth',1.2);hold on;
PZ = zeros(N+1,M+1);
PX = PZ;
PY = PZ;

for i = 1:n+1
    for j = 1:m+1
        PX = PX + Px(i,j)*B_f(x,y,n,m,i-1,j-1);
        PY = PY + Py(i,j)*B_f(x,y,n,m,i-1,j-1);
        PZ = PZ + Pz(i,j)*B_f(x,y,n,m,i-1,j-1);
    end
end
surf(PX,PY,PZ)
end

function z = B_f(x,y,n,m,N,M)        %n:n次bernstein基函数;m:m次bernstein基函数
[x,y] =meshgrid(x,y);                  %N:n次bernstein基函数中取B(n,N)
z = B(x,n,N).*B(y,m,M);
end

function y = B(x,n,i)
y = k(n,i).*(x.^i).*((1-x).^(n-i));
end

function y = k(n,i)
y1 = factorial(n);            %n的阶乘
y2 = factorial(i)*factorial(n-i);
y = y1/y2;
end
%%一开始用的这个坐标,结果一直出错,后来才发现给的点后面调用的时候所有点在一个平面上
% P = [4,0,0;4,2,2;4,4,0;...    %九个点的坐标
%         2,0,2;2,2,4;2,4,2;...
%         0,0,0;0,2,2;0,4,0];
% px = P(:,1);
% Px = reshape(px,3,3);        %将九个点的横坐标写成一个矩阵
% py = P(:,2);
% Py = reshape(py,3,3);
% pz = P(:,1);
% Pz = reshape(pz,3,3);
% A = zeros(9,3);
% A(:,1) = px;
% A(:,2) = py;
% A(:,3) = pz;

3. Bezier曲面的性质

(临近考试,懒得一个个敲上去了,直接上照片)
在这里插入图片描述
在这里插入图片描述
4
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mw_1422102031/article/details/107576139
今日推荐