7-3.m

来自「运用de Casteljau递归求值法编写三角形域上的n次Bezier曲面计算程」· M 代码 · 共 65 行

M
65
字号
a=(sqrt(3)-1)/sqrt(3);                          %%给定原始控制顶点
b=(sqrt(3)+1)/(2*sqrt(3));
r=(5-sqrt(2))*(7-sqrt(3))/46;
Px=[0,0,0,0;a,0,0,0;b,r,0,0;1,1,r,0];
Py=[0,0,0,0;0,a,0,0;0,r,b,0;0,r,1,1];
Pz=[1,0,0,0;1,1,0,0;b,1,b,0;a,r,r,r];

for m=1:3                                            %%画控制网格
    for n=1:m
        x=[Px(m,n) Px(m+1,n) Px(m+1,n+1) Px(m,n)];
        y=[Py(m,n) Py(m+1,n) Py(m+1,n+1) Py(m,n)];
        z=[Pz(m,n) Pz(m+1,n) Pz(m+1,n+1) Pz(m,n)];
        view([-30,15]);
        plot3(x,y,z)
        hold on
        xlabel('x','FontSize',12)
        ylabel('y','FontSize',12)
        zlabel('z','FontSize',12)
        axis normal;
    end
end

tempPx=Px;                                        %%将原始点存储起来
tempPy=Py;
tempPz=Pz;
tempx=zeros(1,1000);                               %%定义中间变量
tempy=zeros(1,1000);
tempz=zeros(1,1000);
c=1;                                               %%定义一计数变量
for u=1:-0.01:0                                    %%对三变量取值                     
    for w=0:0.01:1-u
        v=1-u-w;
      for l=0:2                                   %%用De Casteljau递归求值法迭代
        for s=1:3-l
            for t=1:s
                Px(s,t)=u*Px(s,t)+v*Px(s+1,t)+w*Px(s+1,t+1);
                Py(s,t)=u*Py(s,t)+v*Py(s+1,t)+w*Py(s+1,t+1);
                Pz(s,t)=u*Pz(s,t)+v*Pz(s+1,t)+w*Pz(s+1,t+1);
            end
        end
      end
      tempx(c)=Px(1,1);
      tempy(c)=Py(1,1);
      tempz(c)=Pz(1,1);
      c=c+1;
      Px=tempPx;                            %%取回原始点准备下一次取值迭代
      Py=tempPy;
      Pz=tempPz;
    end
end

x1=zeros(1,c-1);                             %%取迭代所得点
y1=zeros(1,c-1);
z1=zeros(1,c-1);
for i=1:c-1
    x1(i)=tempx(i);
    y1(i)=tempy(i);
    z1(i)=tempz(i);
end

xlin=linspace(min(x1),max(x1));             %%均匀化所得离散值
ylin=linspace(min(y1),max(y1));
[X,Y]=meshgrid(xlin,ylin);                  %%画曲面
Z=griddata(x1,y1,z1,X,Y);
mesh(X,Y,Z);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?