% % 创建一个隐藏的窗口
hFigure = figure('menubar','none','NumberTitle','off','position',...
[198 56 350 400],'name','控制小球的角速度','Visible','off');
% % 创建坐标轴
hAxes = axes('position',[0.25 0.45 0.5 0.5],'visible','off');
axis equal
% % 产生一个圆,作为小球运动的轨迹
t = 0 : 0.1 : 2 * pi + 0.1;
x = sin(t);
y = cos(t);
line(x,y,'LineWidth',2);
% % 设置 uicontrol 对象默认的背景颜色和字体大小和位置单位
set(0,'DefaultuicontrolBackgroundColor',get(hFigure,'color'));
set(0,'DefaultuicontrolFontsize',12);
set(0,'DefaultuicontrolUnits','points');
% % 创建小球
hBobble = line('xdata',0,'ydata',1,'marker','o','MarkerFaceColor',...
'r','markersize',15);
% % 初始化参数
nPos = length(t); % 小球的位置个数
iPos = 1; % 小球的当前位置索引,有效索引值范围为[1 nPos]
delt = 0.01; % 更新小球位置的周期,用于控制小球运动的速度
isPaused = false; % 表征当前是否已经停止(实际上可以理解为暂停)
isForward = true; % 表征当前是正向运动还是反向运动
% % 【开始】按钮的回调函数
btnStart_Callback = ['isPaused = false;',... % 按【开始】按钮后,isPaused 标志的值为假
'while ishandle(hFigure),',... % 判断当前窗口是否存在,若窗口关闭,则不执行循环
'set(hBobble,''xdata'',x(iPos),''ydata'',y(iPos));',... % 更新小球位置
'drawnow,',... % 重绘窗口
'pause(delt),',... % 暂停一段时间再更新小球位置,delt 为执行相邻两次循环所间隔的时间
'iPos = iPos - (-1)^isForward;,',... % 根据 isForward 标志,更新小球位置 iPos
'if iPos == nPos + 1,',... % 若小球的位置索引值小于 nPos
'iPos = 1;',... % 设置小球位置索引值为 1
'elseif iPos == 0,',... % 若小球的位置索引值小于 1
'iPos = nPos;',... % 设置小球位置索引值为 nPos
'end,',...
'if isPaused,',... % 若按了【停止】按钮
'break,',... % 跳出 while 循环
'end,',...
'end'];
% % 创建各GUI控件
uicontrol('string','开始','position',[30 50 50 20],'callback',btnStart_Callback);
uicontrol('string','停止','position',[100 50 50 20],'callback',...
'isPaused = true;'); % 更新 isPaused 标志为真
uicontrol('string','反向','position',[170 50 50 20],'callback',...
'isForward = ~isForward;'); % 对 isPaused 标志取反
uicontrol('string','关闭','position',[100 20 50 20],'callback',...
['isPaused = true;','closereq']); % 先停止,再关闭当前窗口
uicontrol('style','slider','value',0.5,'position',[40 90 190 15],'callback',...
['val = get(gcbo,"value");','delt = val/100 + 0.01;']); % 修改两次 while 循环间隔的时间
uicontrol('style','text','position',[40 110 90 20],'fontsize',12,...
'string','小球运动速度');
% % 显示窗口
set(hFigure,'Visible','on');