三维图形的平移变换可以描述为:
%% 圆的平移,x加1,y加1,z+1
clc;clear all;
figure(1);
axis equal;
sphere(50);%球由50*50个面组成
[x y z]=sphere();
hold on;
dx = 1;dy = 1;dz = 1;
%坐标加一
T = [1 0 0 0;0 1 0 0;0 0 1 0;dx dy dz 1];
Ex = x.*T(1,1)+y.*T(2,1)+z.*T(3,1)+1.*T(4,1);
Ey = x.*T(1,2)+y.*T(2,2)+z.*T(3,2)+1.*T(4,2);
Ez = x.*T(1,3)+y.*T(2,3)+z.*T(3,3)+1.*T(4,3);
% surf(E(:,1:21),E(:,22:42),E(:,43:63));
%surf(x+dx,y+dy,z+dz);
surf(Ex,Ey,Ez);
三维图形的旋转变换可描述为:
%% 绘制一个柱体,然后绕x轴旋转60°
clear all;clc;
[x,y,z]=cylinder(3); %调用cylinder函数‘()’内半径为3. 运行此命令后系统自动为x,y,z填充了数据
z(2,:)=2; %设置矩阵Z的第二行数值全为2,即设置圆柱体高度
figure;
surf(x,y,z,'FaceColor',[1,0,0]); %使用surf功能将x,y,z的数据导入。FaceColor即设置圆柱体颜色,红色色号为[1,0,0]
daspect([1 1 1]) %设置x,y,z坐标间距等长。
view(30,30) %设置图像显示角度
hold on
theta = linspace(0,2*pi,40) %将一个圆周分为40份
X=3*cos(theta); %将cos值赋予x
Y=3*sin(theta); %将sin赋予Y
Z=ones(size(X))+1; %设置Z与X长度想等
fill3(X,Y,Z,[1,0,0]); %使用Fill3功能函数,填充XYZ所围成的区域,这个是顶盖
fill3(X,Y,Z-2,[1,0,0]); %底盖
hold on
T = [1 0 0 0;0 cosd(60) sind(60) 0;0 -sind(60) cosd(60) 0;0 0 0 1];
Ex = x.*T(1,1)+y.*T(2,1)+z.*T(3,1)+1.*T(4,1);%这三句是旋转的柱面的侧面
Ey = x.*T(1,2)+y.*T(2,2)+z.*T(3,2)+1.*T(4,2);
Ez = x.*T(1,3)+y.*T(2,3)+z.*T(3,3)+1.*T(4,3);
%下面是旋转圆面,只旋转的上面的圆面,下面的没有旋转
Ex1 =X.*T(1,1)+Y.*T(2,1)+Z.*T(3,1)+1.*T(4,1);
Ey1 = X.*T(1,2)+Y.*T(2,2)+Z.*T(3,2)+1.*T(4,2);
Ez1 = X.*T(1,3)+Y.*T(2,3)+Z.*T(3,3)+1.*T(4,3);
surf(Ex,Ey,Ez);
fill3(Ex1,Ey1,Ez1,[1,0,0]);
错切变换的常用变换矩阵为:
%% 3.用sphere生成多面体,然后对其进行错切变换,不断的改变错切系数和多面体的数量
clear all;clc;
T=[1 0 0;
1 1 0;
0 0 1];
for num = 1:10 %多边形的数量
for ti = 1:0.05:1.1 %错切系数
T(2,1) = T(2,1)*ti; %改变错切系数
[x,y,z] = sphere(num);
fprintf("错切系数:%f\n",T(2,1));
surf(x,y,z);
fprintf("显示第%d边形\n",num);
pause(0.5);
for i=1:num+1
for j=1:num+1
a=x(i,j);
b=y(i,j);
c=z(i,j);
m=[a b c]*T';
x1(i,j)=m(1);
y1(i,j)=m(2);
z1(i,j)=m(3);
end
end
fprintf("错切第%d边形\n",num);
surf(x1,y1,z1)
pause(0.5);
end
T(2,1) = 1;
end