今天分享一个有趣的小程序,起初是在网上偶然看到,经过一定的改良。主要模拟的是月亮绕地公转过程中探月器的登陆,是个非常简略的程序。同时用GUI做了一小点交互,用来学习一下Matlab里面的作图非常不错。大家可以照着图片来自己先动手试试。
如图所示,可以自己设置刷新时间,如果刷新时间设置成负数或是0会弹出错误提示框。
刷新时间的设置也和月亮以及探月器的公转角速度相关。程序最终运行完成如下图所示:
代码如下:
NO.1 开始按钮的回调函数
----------------------------------
function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)pausetime = str2double(get(handles.edit1,'string'));%设置刷新时间if pausetime > 0 clc; figure('name','探月器登陆'); %设置标题名字 title('探月器登陆动画演示','fontsize',15) x = [0:0.01:2*pi]; hold on; axis square axis off %去除坐标轴 grid on r1 = 10; %月亮到地球的距离 r2_begin = 3; %探月器到月亮的初始距离 w1 = 1; %月亮公转角速度 w2 = 12; %探月器绕月亮公转角速度 t = 0; pausetime = 0.02; %设置暂停时间 sita1=0; %初始角度 sita2=0; %------------设置图例 plot(-20,18,'color','m','marker','.','markersize',40); text(-17,18,'地球'); %地球 plot(-20,16,'color','b','marker','.','markersize',25); text(-17,16,'月亮'); %月亮 plot(-20,14,'color','k','marker','.','markersize',15); text(-17,14,'探月器'); %探月器 %------------ axis([-20,20,-20,20]); plot(0,0,'color','m','marker','.','markersize',80); %画地球 plot(r1*cos(x),r1*sin(x)); %画月亮公转轨道(极坐标) p1 = plot(r1*cos(sita1),r1*sin(sita1),'color','b','marker','.','markersize',30);%画月亮初始位置 l1 = plot(r1*cos(sita1)+r2_begin*cos(x),r1*sin(sita1)+r2_begin*sin(x)); %探月器绕月亮公转轨道 p2x=r1*cos(sita1)+r2_begin*cos(sita2); %用极坐标画个草图就知道了 p2y=r1*sin(sita1)+r2_begin*sin(sita2); p2=plot(p2x,p2y,'k','marker','.','markersize',20); %画探月器的初始位置 orbit=line('xdata',p2x,'ydata',p2y,'color','r'); %画探月器的运动轨迹 for r2 = r2_begin:-0.006:0 sita1=sita1+w1*pausetime;%月亮相对地球转过的角度 sita2=sita2+w2*pausetime;%探月器相对月亮转过的角度 set(p1,'xdata',r1*cos(sita1),'ydata',r1*sin(sita1));%设置月亮的新位置 set(l1,'xdata',r1*cos(sita1)+r2*cos(x),'ydata',r1*sin(sita1)+r2*sin(x)); %设置探月器绕月亮的公转轨道的新位置 ptempx=r1*cos(sita1)+r2*cos(sita2); ptempy=r1*sin(sita1)+r2*sin(sita2); set(p2,'xdata',ptempx,'ydata',ptempy);%设置探月器的新位置 p2x = [p2x ptempx]; p2y = [p2y ptempy]; set(orbit,'xdata',p2x,'ydata',p2y); %运动轨迹的连续显示 pause(pausetime); %暂停 drawnow end msgbox('探月登陆完成','有趣的小游戏','warn');else errordlg('请输入正确刷新时间'); %错误提示end
NO.2 结束按钮的回调函数
----------------------------------
function pushbutton2_Callback(hObject, eventdata, handles)% hObject handle to pushbutton2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)clcclear allclose all force; %强制关闭所有的图形