matlab编程,太阳地球月亮公转自转,球体贴图,基于matlab的仿真,实现了太阳的自转以及地球月球的自转公转。
k=6;
n = 2^k-1;
[x,y,z]=sphere(n );
A = imread('taiyang.png');
patches0=surf2patch(x,y,z,A);
k=6;
n = 2^k-1;
[x,y,z]=sphere(n );
AA = imread('diqiu00.png');
patches1=surf2patch(x,y,z,AA);
k=6;
n = 2^k-1;
[x,y,z]=sphere(n );
AAA = imread('yueqiu.png');
patches2=surf2patch(x,y,z,AAA);
%set(patches,'edgecolor','none')
% 设计太阳月亮地球的相对大小
Ssun=1;
Searth=0.4;
Smoon=0.2;
% 设置太阳与地球间的距离
Res=4;
% 设置地球与月亮之间的距离
Rme=1;
alpha=0;
beta=0;
theta=0;
% 设置旋转速度
step_a=0.1; %a的步长
step_b=0.2; %b的步长
step_t=0.05; %c的步长
% 设置太阳的位置
Csun=[0,0,0];
% 计时器
time=0;
h=figure;
% 取消坐标轴之类的属性
set(h,'toolbar','none','menubar','none','numbertitle','off')
% 进入大循环
while 1==1
clf
% 设置地球的位置
Cx=4*cos(alpha);
Cy=4*sin(alpha);
Cz=0;
Cearth=[Cx,Cy,Cz];
Cmoon=[Cx+cos(2*alpha);Cy+sin(2*alpha);0;1];
patches_sun=patches0;
% 绕z轴旋转坐标公式
Rz=[cos(5*theta) -sin(5*theta) 0;sin(5*theta) cos(5*theta) 0;0 0 1];
[len]=64*64;
for i=1:len
P=Rz*[patches0.vertices(i,1);patches0.vertices(i,2);patches0.vertices(i,3)];
patches_sun.vertices(i,1)=P(1);
patches_sun.vertices(i,2)=P(2);
patches_sun.vertices(i,3)=P(3);
end
patch(patches_sun),shading flat,hold on
patches_moon=patches2;
[len,t]=size(patches2.vertices);
for i=1:len
P=Rz*[patches2.vertices(i,1)*Smoon;patches2.vertices(i,2)*Smoon;patches2.vertices(i,3)*Smoon]+[Cmoon(1);Cmoon(2);Cmoon(3)];
patches_moon.vertices(i,1)=P(1);
patches_moon.vertices(i,2)=P(2);
patches_moon.vertices(i,3)=P(3);
end
patch(patches_moon),shading flat
% 与改变太阳顶点值一致,改变地球的顶点值
patches_earth=patches1;
[len,t]=size(patches1.vertices);
for i=1:len
P=Rz*[patches1.vertices(i,1)*Searth;patches1.vertices(i,2)*Searth;patches1.vertices(i,3)*Searth]+[Cx;Cy;Cz];
patches_earth.vertices(i,1)=P(1);
patches_earth.vertices(i,2)=P(2);
patches_earth.vertices(i,3)=P(3);
end
patch(patches_earth),shading flat
daspect([1,1,1]);
campos([7,7,2]),camtarget([0,0,0]),camup([0,0,1]),camva(30),
% 关闭所有的坐标轴标签、刻度、背景
axis off
%set(patches,'edgecolor','none')
% 暂停0.1秒
pause(0.1)
% 记时+1
time=time+1;
% 太阳地球月亮一次改变的数值
beta=beta+step_b;
alpha=alpha+step_a;
theta=theta+step_t;
end