三维图形的平移,旋转与错切

1、平移变换

    三维图形的平移变换可以描述为:

%% 圆的平移,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);

2.旋转变换

三维图形的旋转变换可描述为:

%% 绘制一个柱体,然后绕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.错切变换

错切变换的常用变换矩阵为:

%% 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GallagherZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值