在之前绘制Bezier曲线的基础上绘制Bezier曲面,下面只是举了一类,其他的例子可以类似进行,下面直接贴代码~
function decasteljau_surf(vertices)
%DECASTELJAU_SURF Summary of this function goes here
% Detailed explanation goes here
NumPoint1=size(vertices,1)-1;%indicate the Num of line
NumPoint2=size(vertices,2)-1;
x=zeros(1,NumPoint1+1);y=zeros(1,NumPoint1+1);z=zeros(1,NumPoint1+1);
ps=zeros(11,4,3);
for v=1:4
u=1;
for t=0:0.1:1
for i=1:NumPoint1
for j=0:NumPoint1-i
if i==1
x(j+1) = (1 - t)*vertices(j+1,v,1) + t*vertices(j+2,v,1);
y(j+1) = (1 - t)*vertices(j+1,v,2) + t*vertices(j+2,v,2);
z(j+1) = (1 - t)*vertices(j+1,v,3) + t*vertices(j+2,v,3);
continue;
end
x(j+1)=x(j+1)*(1-t)+x(j+2)*t;
y(j+1)=y(j+1)*(1-t)+y(j+2)*t;
z(j+1)=z(j+1)*(1-t)+z(j+2)*t;
end
end
ps(u,v,1)=x(1);
ps(u,v,2)=y(1);
ps(u,v,3)=z(1);
u=u+1;
end
end
x=zeros(1,NumPoint2+1);y=zeros(1,NumPoint2+1);z=zeros(1,NumPoint2+1);
ps1=zeros(11,11,3);
for v=1:11
u=1;
for t=0:0.1:1
for i=1:NumPoint2
for j=0:NumPoint2-i
if i==1
x(j+1) = (1 - t)*ps(v,j+1,1) + t*ps(v,j+2,1);
y(j+1) = (1 - t)*ps(v,j+1,2) + t*ps(v,j+2,2);
z(j+1) = (1 - t)*ps(v,j+1,3) + t*ps(v,j+2,3);
continue;
end
x(j+1)=x(j+1)*(1-t)+x(j+2)*t;
y(j+1)=y(j+1)*(1-t)+y(j+2)*t;
z(j+1)=z(j+1)*(1-t)+z(j+2)*t;
end
end
ps1(v,u,1)=x(1);
ps1(v,u,2)=y(1);
ps1(v,u,3)=z(1);
u=u+1;
end
end
plot3(vertices(:,:,1),vertices(:,:,2),vertices(:,:,3),'b*');
hold on;
for i=1:NumPoint1+1
plot3(vertices(i,:,1),vertices(i,:,2),vertices(i,:,3),'r');hold on;
end
for i=1:NumPoint2+1
plot3(vertices(:,i,1),vertices(:,i,2),vertices(:,i,3),'r');hold on;
end
hold on;
plot3(ps1(:,:,1),ps1(:,:,2),ps1(:,:,3),'r*');
for i=1:11
plot3(ps1(i,:,1),ps1(i,:,2),ps1(i,:,3),'b');hold on;
plot3(ps1(:,i,1),ps1(:,i,2),ps1(:,i,3),'b');hold on;
end
hold on;
% for i=1:11
% plot3(ps1(:,i,1),ps1(:,i,2),ps1(:,i,3),'r');hold on;
% end
end 下面举两例
vertices=zeros(4,4,3);
vertices(1,:,:)=[-0.8,-0.7,0.2;-0.3,-0.6,0.2;0.2,-0.65,0.3;0.7,-0.7,0.2];
vertices(2,:,:)=[-0.9,-0.2,0.3;-0.3,0.2,0.5;0.3,-0.2,0.4;0.75,-0.2,0.3];
vertices(3,:,:)=[-0.9,0.3,0.3; -0.3,0.5,0.5;0.25,0.25,0.6;0.8,0.3,0.3];
vertices(4,:,:)=[-0.8,0.8,0.1; -0.3,0.8,0.2;0.2,0.85,0.1;0.7,0.8,0.1];
decasteljau_surf(vertices);
再举一例
vertices=zeros(3,4,3);
vertices(1,:,:)=[-0.8,-0.7,0.2;-0.3,-0.6,0.2;0.2,-0.65,0.3;0.7,-0.7,0.2];
vertices(2,:,:)=[-0.9,-0.2,0.3;-0.3,0.2,0.5;0.3,-0.2,0.4;0.75,-0.2,0.3];
vertices(3,:,:)=[-0.8,0.8,0.1; -0.3,0.8,0.2;0.2,0.85,0.1;0.7,0.8,0.1];
decasteljau_surf(vertices);
棒棒哒~
|