📄 animbb.m
字号:
if str2double(get_param(constant_block, 'value')) < 0,
set(signalH, 'value', 4);
end
% ====== Appending handles as the second row of userdata
tmp = [signalH dispmodeH -1 -1 -1 -1 -1 -1 -1 -1];
olduserdata=get(AnimBbFigH, 'userdata');
newuserdata.tmp=[olduserdata.tmp; tmp];
newuserdata.winName=winName;
set(AnimBbFigH, 'userdata', newuserdata);
% ###### animation objects ######
% ====== ball
radius = 0.1;
theta = linspace(0, 2*pi, 21);
ball = radius*exp(j*theta) + j*2*radius;
ballH = patch(real(ball), imag(ball), 'm');
set(ballH, 'erase', 'xor');
set(ballH, 'userdata', ball);
% ====== beam
beam_length = 4.0;
beam_width = radius;
beam = beam_length/2*[-1 1 1 -1 -1]' + ...
sqrt(-1)*(beam_width/2*[-1 -1 1 1 -1]' + beam_width/2);
beamH = patch(real(beam), imag(beam), 'y');
set(beamH, 'erase', 'xor');
set(beamH, 'userdata', beam);
% ====== force arrow
force_x = [-1 0 nan -0.1 0 -0.1];
force_y = [0 0 nan 0.1 0 -0.1];
force = force_x + j*force_y;
force = force*exp(j*pi/2);
forceH = line(real(force), imag(force), ...
'erase', 'xor', 'color', 'c', 'clip', 'off');
set(forceH, 'userdata', force, ...
'xdata', [0], 'ydata', [0]);
% ====== reference triangle
ref = 2*beam_width*[-1 1 0 -1]' + ...
sqrt(-1)*(4*beam_width*[0 0 1 0]' - 4*beam_width);
refH = line(real(ref), imag(ref));
set(refH, 'color', 'r', 'linewidth', 2);
%refH = patch(real(ref), imag(ref), 'r');
set(refH, 'erase', 'xor');
set(refH, 'userdata', ref);
% ====== support triangle
support_height = radius*10;
support_width = support_height;
support = support_width/2*[-1 1 0 -1]' + ...
sqrt(-1)*(support_height*[0 0 1 0]' - support_height);
supportH = patch(real(support), imag(support), 'g');
set(supportH, 'erase', 'xor');
set(supportH, 'userdata', ref);
% ====== axis settings
pos_range = [-3 3];
set(AnimBbAxisH, 'clim', [1 64], ...
'xlim', pos_range, ...
'ylim', [-1.5*support_height 2.98-1.5*support_height], ...
'box', 'on');
axis equal;
set(AnimBbAxisH, 'visible', 'off');
% ====== colormap settings for floor
colormap(gray); % To assign correct patch color
patch([pos_range -pos_range], ...
0.2*[-2 -2 0 0]-support_height, [10 10 55 55]);
% ====== append the handles as third row of userdata
tmp = [ballH beamH forceH refH -1 -1 -1 -1 -1 -1];
olduserdata=get(AnimBbFigH, 'userdata');
newuserdata.tmp=[olduserdata.tmp; tmp];
newuserdata.winName=winName;
set(AnimBbFigH, 'userdata', newuserdata);
% ====== change to normalized units
set(findobj(AnimBbFigH,'Units','pixels'), 'Units','normalized');
% ====== move the reference triangle by mouse
% action when button is first pushed down
action1 = [mfilename '([], [], [], [], ''mouse_action'')'];
% actions after the mouse is pushed down
action2 = action1;
% action when button is released
action3 = action2;
% temporary storage for the recall in the down_action
set(AnimBbAxisH,'UserData',action2);
% set action when the mouse is pushed down
down_action=[ ...
'set(AnimBbFigH,''WindowButtonMotionFcn'',get(AnimBbAxisH,''UserData''));' ...
action1];
set(AnimBbFigH,'WindowButtonDownFcn',down_action);
% set action when the mouse is released
up_action=[ ...
'set(AnimBbFigH,''WindowButtonMotionFcn'','' '');', action3];
set(AnimBbFigH,'WindowButtonUpFcn',up_action);
end
% ====== change labels of standard UI controls
newuserdata= get(AnimBbFigH, 'userdata');
tmp = newuserdata.tmp;
set(tmp(1, 1), 'visible', 'off');
set(tmp(1, 2:3), 'visible', 'on');
sys = [0 0 0 4 0 0];
x0=[];
set(AnimBbFigH, 'HandleVisibility', 'on');
elseif nargin == 5, % for callbacks of GUI
% ###### standard UI controls
if strcmp(action, 'start_sl'),
% tmp = get(AnimBbFigH, 'userdata');
newuserdata= get(AnimBbFigH, 'userdata');
tmp = newuserdata.tmp;
set(tmp(1, 1), 'visible', 'off');
set(tmp(1, 2:3), 'visible', 'on');
winName = newuserdata.winName;
set_param(winName, 'SimulationCommand', 'start');
elseif strcmp(action, 'stop_sl'),
newuserdata= get(AnimBbFigH, 'userdata');
tmp = newuserdata.tmp;
set(tmp(1, 1), 'visible', 'on');
set(tmp(1, 2:5), 'visible', 'off');
winName = newuserdata.winName;
set_param(winName, 'SimulationCommand', 'stop');
elseif strcmp(action, 'pause_sl'),
newuserdata= get(AnimBbFigH, 'userdata');
tmp = newuserdata.tmp;
winName=newuserdata.winName;
set(tmp(1, 3), 'visible', 'off');
set(tmp(1, 4:5), 'visible', 'on');
% [winName] = bdroot(gcs);
set_param(winName, 'SimulationCommand', 'pause');
elseif strcmp(action, 'step_sl'),
newuserdata= get(AnimBbFigH, 'userdata');
winName=newuserdata.winName;
set_param(winName, 'SimulationCommand', 'step');
elseif strcmp(action, 'continue_sl'),
newuserdata= get(AnimBbFigH, 'userdata');
tmp = newuserdata.tmp;
winName=newuserdata.winName;
set(tmp(1, 3), 'visible', 'on');
set(tmp(1, 4:5), 'visible', 'off');
set_param(winName, 'SimulationCommand', 'continue');
elseif strcmp(action, 'info'),
helpwin(mfilename);
% title = get(AnimBbFigH, 'Name');
% content = ...
% [' '
% ' Animation of the ball & beam (BB) system, where a '
% ' Sugeno-type fuzzy controller is used to move the '
% ' ball to a target position indicated by the red '
% ' triangle. '
% ' '
% ' If the target position is chosen as mouse-driven, '
% ' you can click your mouse inside the red triangle '
% ' to move it to another position. '
% ' '
% ' Animation S-function: animbb.m '
% ' SIMULINK file: slbb.m '];
% fhelpfun(title, content);
elseif strcmp(action, 'close'),
% [winName, sysName] = get_param;
% set_param(winName, 'Simulation running', 'stop');
delete(AnimBbFigH);
% ###### additional UI controls
elseif strcmp(action, 'target_pos'),
newuserdata= get(AnimBbFigH, 'userdata');
tmp = newuserdata.tmp;
winName=newuserdata.winName;
if strcmp(get_param(winName,'SimulationStatus'),'running')
error('Cannot change target position when simulation is running')
end
signal_block = [winName, '/Target Position'];
constant_block = [winName, '/Constant'];
signalH = tmp(2, 1);
signal = get(signalH, 'value');
if signal == 1, % sinusoid wave
set_param(signal_block, 'wave', 'sine');
set_param(constant_block, 'value','1');
elseif signal == 2, % square wave
set_param(signal_block, 'wave', 'square');
set_param(constant_block, 'value', '1');
elseif signal == 3, % saw wave
set_param(signal_block, 'wave', 'sawtooth');
set_param(constant_block, 'value', '1');
elseif signal == 4, % mouse-driven
set_param(constant_block, 'value', '-1');
else
error('Unknown wave option!');
end
elseif strcmp(action, 'show_trail'),
newuserdata= get(AnimBbFigH, 'userdata');
tmp = newuserdata.tmp;
winName=newuserdata.winName;
dispmodeH = tmp(2, 2);
objectH = tmp(3, 1:4);
dispmode = get(dispmodeH, 'value');
if dispmode == 0, % xor
set(objectH, 'erasemode', 'xor');
set(AnimBbFigH, 'color', get(AnimBbFigH, 'color'));
else
set(objectH, 'erasemode', 'none');
end
elseif strcmp(action, 'clear_trail'),
refresh(AnimBbFigH);
elseif strcmp(action, 'mouse_action')
newuserdata= get(AnimBbFigH, 'userdata');
tmp = newuserdata.tmp;
winName=newuserdata.winName;
if str2double(get_param([winName, '/Constant'], 'value')) < 0,
curr_info = get(AnimBbAxisH, 'CurrentPoint');
% tmp = get(AnimBbFigH, 'UserData');
beamH = tmp(3, 2);
refH = tmp(3, 4);
theta = tmp(3, 5);
beam = get(beamH, 'userdata');
beam_length = real(beam(2)) - real(beam(1));
desired_pos = curr_info(1,1)/cos(theta);
desired_pos = min(max(desired_pos, ...
-beam_length/2.5), beam_length/2.5);
ref = get(refH, 'userdata');
new_ref = (ref + desired_pos)*exp(j*theta);
set(refH, 'xdata', real(new_ref), 'ydata', imag(new_ref));
set_param([winName, '/Target Position',13,'(Mouse-Driven)'],...
'value', num2str(desired_pos));
end
else
fprintf('Unknown action string: %s.\n', action);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -