⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 animbb.m

📁 模糊控制工具箱,很好用的,有相应的说明文件,希望对大家有用!
💻 M
📖 第 1 页 / 共 2 页
字号:
        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 + -