利用de Casteljau算法绘制Bezier曲面

论坛 期权论坛 脚本     
匿名技术用户   2020-12-22 21:51   11   0

在之前绘制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);
棒棒哒~

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP