% ②三维图形变换
%% 绘制一个柱体,然后绕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]);
%% 2. 编写一段代码,绘制一个球体,然后平移(利用hold on把变换前后的球体放在同一个figure中)
% h1 = drawSphere(5, 4, 3, 6);
% hold on;
% h2 = drawSphere(5, -1, -1,-3);
% axis equal
%
% % 方法2 通过后续的颜色指定改变球体的颜色
% h1 = drawSphere(5, 4, 3, 6);
% hold on;
% h1.EdgeColor = [1, 0, 0]
% h1.FaceColor = [1,0,0]
% h2 = drawSphere(5, -1, -1, -3);
% h2.EdgeColor = [1,0,0];
% h2.FaceColor = [1,0,0];
% axis equal
%% 2 绘制一个柱体,然后绕x轴旋转60°
%
% [x,y,z]=cylinder(3); %调用cylinder函数‘()’内半径为3. 运行此命令后系统自动为x,y,z填充了数据
% z(2,:)=6; %设置矩阵Z的第二行数值全为2,即设置圆柱体高度6
% subplot(1,2,1); %绘制子图像(1,2,1)代表一行两列的第一个图像
% 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,60) %设置图像显示角度view(az,el)其中az为方位角,el为仰角,它们均以度为单位。系统默认的视点定义为方位角为-37.5度,仰角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]); %底盖
%% 2.1 Matlab 画出不同位置高度的圆柱
% %圆柱上表面自变量
% [a,r]=ndgrid((0:.05:1)*2*pi,[0 1]);
% xt=cos(a).*r;%21x2维
% yt=sin(a).*r;%21x2维
% %定义圆心
% xx=[1;3;4];
% yy=[1;1;3];
% %圆柱高矩阵
% zz=[1;2;3];
% %中间变量
% newxx=zeros(21,1);
% newyy=zeros(21,1);
% tempnewxx=newxx;
% tempnewyy=newyy;
% for j=1:3
% newxx=tempnewxx;
% newyy=tempnewyy;
% for i=1:21
% newxx(i,:)=xx(j,1);
% newyy(i,:)=yy(j,1);
% end
% %确定范围
% [a,z]=ndgrid((0:.05:1)*2*pi,0:.05:zz(j,1));
% x=cos(a);%21xsize(z,2)维 项数=((末项-首项)/公差)+1,这里是((1-0)/0.05)+1=21,z=1
% y=sin(a);%21xsize(z,2)维
% %画圆柱测面
% fuzhinewxx=newxx;
% fuzhinewyy=newyy;
% for i=1:(size(z,2)-1)
% newxx=cat(2,newxx,fuzhinewxx);
% newyy=cat(2,newyy,fuzhinewyy);
% end
%
% surf(x+newxx,y+newyy,z,x*0)
% axis equal
% hold on
%
% %画圆柱上表面
% newxx=fuzhinewxx;
% newyy=fuzhinewyy;
% for i=1:(2-1)
% newxx=cat(2,newxx,fuzhinewxx);
% newyy=cat(2,newyy,fuzhinewyy);
% end
% surf(xt+newxx,yt+newyy,xt*0,xt*0)
% surf(xt+newxx,yt+newyy,xt*0+zz(j,1),xt*0)
% end
%
%
% %% 2.2 matlab画水平实心圆柱体,已知圆柱体的半径和高度。
% r=1; %圆柱半径
% n=100;%设置多少个边逼近圆
% h=5; %圆柱高
% [x,y,z]=cylinder(r,n); %生成标准的100个面的圆柱数据,半径为r,高为1,底面圆心0,0;
% z1=[z(1,:);z(2,:)+h-1]; %圆柱高增高,变为高h
%
% %为变成实心封顶添加数据
% z2=[z(1,:);z1;z1(2,:)];
% x2=[zeros(1,n+1);x;zeros(1,n+1)];
% y2=[zeros(1,n+1);y;zeros(1,n+1)];
%
% z3=[z1(1,:);z1(1,:)];
% x3=[x(1,:);x(1,:)];
% y3=[y(1,:);y(1,:)];
% z4=[z1(2,:);z1(2,:)];
%
% z5=z2([1,2],:);x5=x2([1,2],:);y5=y2([1,2],:);z6=z2([3,4],:);
%
% figure(1)
% mesh(x2,z2,y2)
% map=jet(16);
% cl=12; %可设置16种颜色(1-16)
% map1=map(cl,:);
% colormap(map1)
% alpha(0.6)%调节透明度(0-1)
% axis equal
%
% figure(2)
% surf(x2,z2,y2,'LineStyle','none')
% map=jet(16);
% cl=4; %可设置16种颜色(1-16)
% map1=map(cl,:);
% colormap(map1)
% hold on
% surf(x3,z3,y3)
% surf(x3,z4,y3)
% alpha(.7)%调节透明度(0-1)
% hold off
% axis equal
%
% figure(3)
% surf(x,z1,y)
% map=jet(16);cl=13;%可设置8种颜色(1-16)
% map1=map(cl,:);
% colormap(map1)
% hold on
% surf(x5,z5,y5,'LineStyle','none')
% surf(x5,z6,y5,'LineStyle','none')
% alpha(.9)%调节透明度(0-1)
% hold off
% axis equal
% %% 2.3 matlab中的colormap()染色器(以圆柱体为例)
% % subplot(1,2,1) %将界面分为1行两列,画在第1列
% %画圆柱体
% ezsurf('(3*cos(u))','3*sin(u)','v',[0,3*pi,0,3*pi])
% %网格
% grid on
% shading interp
% colormap(hsv); %调用colormap()改变图像颜色
% axis equal
% xlabel('x轴');ylabel('y轴');zlabel('z轴');
% title('圆柱面')
% %第二个圆柱体
% subplot(1,2,2) %1行两列, 取第二列
% cylinder(30) %中间参数指半径
% colormap(hot)
% shading interp
% axis square
% title('调用cylinder函数所得圆柱面')