matlab 使得三维图形可以手动旋转,三维图形的平移,旋转与错切

本文介绍了如何在MATLAB中通过代码实现三维图形的平移(将球面沿x、y、z轴各加1)、旋转变换(围绕x轴旋转柱体60°)以及错切变换(动态改变多面体的错切系数)。通过详细步骤和矩阵操作演示了图形变换在计算机视觉和图形学中的应用。
摘要由CSDN通过智能技术生成

1、平移变换

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

4da2e6ac5c8d20f580c842fea314af30.png

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

1e08e17646d904fd1e57e7b2699232db.png

2.旋转变换

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

f41d6729ea4aecfb35741b4fd15e6bca.png

%% 绘制一个柱体,然后绕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]);

6e79add08e3680514f08cca6ab5733c6.png

3.错切变换

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

179e96818b0889bb4ed7dec72c011b03.png

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

3365062cd07b9629c2251794d0e2252d.png

1cdf8afe70779ecb7692555c1a6c482e.png

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值