天天看點

bezier曲面制作_利用de Casteljau算法繪制Bezier曲面

在之前繪制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);

bezier曲面制作_利用de Casteljau算法繪制Bezier曲面

再舉一例

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);

bezier曲面制作_利用de Casteljau算法繪制Bezier曲面

棒棒哒~