www.gusucode.com > 模糊控制工具箱 fuzzy logic toolbox源码程序 > fuzzy/fuzzy/mfdrag.m

    function [out1, out2] = mfdrag(action,lineHndl,mfType,mfParam)
% MFDRAG Interactive changes of membership functions by clicking and dragging.
%   It is called from mfedit.m where action is 'mf' and lineHndl is the current
%   selected membership function.  MFDRAG allows clicking and dragging of 
%   membership functions to change their shapes. In general, clicking on a 
%   membership function curve translates the whole curve; clicking on square 
%   control points changes the shape.
%
%       File name: mfdrag.m
%
%       See also DSIGMF, GAUSSMF, GAUSS2MF, GBELLMF, EVALMF, PIMF, PSIGMF,
%       SIGMF, SMF, TRAPMF, TRIMF, and ZMF.

%       Roger Jang, 6-28-95, Kelly Liu 3-12-97, Rajiv Singh 03/29/2002
%       Copyright 1994-2004 The MathWorks, Inc.
% $Revision: 1.19.4.5 $ $Date: 2005/06/27 22:38:43 $
selectColor = [1 0 0];
f = findobj(allchild(0),'type','figure','tag','mfedit');
switch action
case 'mf',
    lineH=lineHndl;
    set(lineH, 'Color', 'red');
    x = get(lineH, 'xdata');
    mf_type = mfType;
    mf_param = mfParam;
    new_mf = evalmf(x, mf_param, mf_type); 
    set(lineH, 'ydata', new_mf, 'color', 'red');
    % setting control points and mouse actions
    feval(mfilename, 'set_control_point', lineH, mf_type, mf_param);
    
case 'get_current_mf',
    mf_type = str2mat('trimf', 'trapmf', 'gbellmf', 'gaussmf', 'gauss2mf',...
        'sigmf', 'dsigmf',  'psigmf', 'pimf',...
        'smf', 'zmf');
    mf_type = str2mat(mf_type);
    
    %       mf_param_n = [3 4 2 2 3 2 2 4 4 4 4];
    which_mf = get(findobj(f, 'tag', 'mftype'), 'value');
    out1 = mf_type(which_mf, :);
    out2=[];
    
case 'set_control_point',
    % delete all possible previous control points
    delete(findobj(f, 'tag', 'leftlow'));
    delete(findobj(f, 'tag', 'lefthigh'));
    delete(findobj(f, 'tag', 'center'));
    delete(findobj(f, 'tag', 'righthigh'));
    delete(findobj(f, 'tag', 'rightlow'));
    % find MF types and parameters
    mf_type = mfType;
    mf_param = mfParam;
    square = local_get_control_square;
    controlcolor='black';
    if strcmp(mf_type, 'trimf'),
        leftlowH = line(mf_param(1)+real(square), imag(square), ...
            'color', controlcolor, 'tag', 'leftlow');
        centerH = line(mf_param(2)+real(square), 1+imag(square), ...
            'color', controlcolor, 'tag', 'center');
        rightlowH = line(mf_param(3)+real(square), imag(square), ...
            'color', controlcolor, 'tag', 'rightlow');
    elseif strcmp(mf_type, 'trapmf') | strcmp(mf_type, 'pimf'),
        leftlowH = line(mf_param(1)+real(square), imag(square), ...
            'color', controlcolor, 'tag', 'leftlow');
        lefthighH = line(mf_param(2)+real(square), 1+imag(square), ...
            'color', controlcolor, 'tag', 'lefthigh');
        righthighH = line(mf_param(3)+real(square), 1+imag(square), ...
            'color', controlcolor, 'tag', 'righthigh');
        rightlowH = line(mf_param(4)+real(square), imag(square), ...
            'color', controlcolor, 'tag', 'rightlow');
    elseif strcmp(mf_type, 'gaussmf'),
        sigma = mf_param(1);
        c = mf_param(2);
        height = 0.5;
        x_left = c - sigma*sqrt(-2*log(height));
        x_right = c + sigma*sqrt(-2*log(height));
        leftlowH = line(x_left+real(square), height+imag(square), ...
            'color', controlcolor, 'tag', 'leftlow');
        rightlowH = line(x_right+real(square), height+imag(square), ...
            'color', controlcolor, 'tag', 'rightlow');
    elseif strcmp(mf_type, 'gauss2mf'),
        s1 = mf_param(1); c1 = mf_param(2);
        s2 = mf_param(3); c2 = mf_param(4);
        height = 0.5;
        x_left = c1 - s1*sqrt(-2*log(height));
        x_right = c2 + s2*sqrt(-2*log(height));
        leftlowH = line(x_left+real(square), height+imag(square), ...
            'color', controlcolor, 'tag', 'leftlow');
        rightlowH = line(x_right+real(square), height+imag(square), ...
            'color', controlcolor, 'tag', 'rightlow');
        lefthighH = line(mf_param(2)+real(square), 1+imag(square), ...
            'color', controlcolor, 'tag', 'lefthigh');
        righthighH = line(mf_param(4)+real(square), 1+imag(square), ...
            'color', controlcolor, 'tag', 'righthigh');
    elseif strcmp(mf_type, 'sigmf'),
        a = mf_param(1);
        c = mf_param(2);
        height = 0.1;
        leftlowH = line(c-log(1/height-1)/a + real(square), ...
            height + imag(square), ...
            'color', controlcolor, 'tag', 'leftlow');
        righthighH = line(c-log(1/(1-height)-1)/a + real(square), ...
            1-height + imag(square), ...
            'color', controlcolor, 'tag', 'righthigh');
    elseif strcmp(mf_type, 'gbellmf'),
        a = mf_param(1); b = mf_param(2); c = mf_param(3);
        height = 0.9;
        leftlowH = line(c-a+real(square), 0.5+imag(square), ...
            'color', controlcolor, 'tag', 'leftlow');
        rightlowH = line(c+a+real(square), 0.5+imag(square), ...
            'color', controlcolor, 'tag', 'rightlow');
        lefthighH = line(c-a*(1/height-1)^(1/(2*b))+real(square), ...
            height+imag(square), 'color', controlcolor, 'tag', 'lefthigh');
        righthighH = line(c+a*(1/height-1)^(1/(2*b))+real(square), ...
            height+imag(square), 'color', controlcolor, 'tag', 'righthigh');
    elseif strcmp(mf_type, 'smf'),
        leftlowH = line(mf_param(1)+real(square), imag(square), ...
            'color', controlcolor, 'tag', 'leftlow');
        righthighH = line(mf_param(2)+real(square), 1+imag(square), ...
            'color', controlcolor, 'tag', 'righthigh');
    elseif strcmp(mf_type, 'zmf'),
        lefthighH = line(mf_param(1)+real(square), 1+imag(square), ...
            'color', controlcolor, 'tag', 'lefthigh');
        rightlowH = line(mf_param(2)+real(square), imag(square), ...
            'color', controlcolor, 'tag', 'rightlow');
    elseif strcmp(mf_type, 'psigmf'),
        a1=mf_param(1); c1=mf_param(2); a2=mf_param(3); c2=mf_param(4);
        height = 0.9;
        leftlowH = line(c1+real(square), 0.5+imag(square), ...
            'color', controlcolor, 'tag', 'leftlow');
        rightlowH = line(c2+real(square), 0.5+imag(square), ...
            'color', controlcolor, 'tag', 'rightlow');
        lefthighH = line(c1-log(1/height-1)/a1+real(square), ...
            height+imag(square), ...
            'color', controlcolor, 'tag', 'lefthigh');
        righthighH = line(c2-log(1/height-1)/a2+real(square), ...
            height+imag(square), ...
            'color', controlcolor, 'tag', 'righthigh');
    elseif strcmp(mf_type, 'dsigmf'),
        a1=mf_param(1); c1=mf_param(2); a2=mf_param(3); c2=mf_param(4);
        height = 0.9;
        leftlowH = line(c1+real(square), 0.5+imag(square), ...
            'color', controlcolor, 'tag', 'leftlow');
        rightlowH = line(c2+real(square), 0.5+imag(square), ...
            'color', controlcolor, 'tag', 'rightlow');
        lefthighH = line(c1-log(1/height-1)/a1+real(square), ...
            height+imag(square), ...
            'color', controlcolor, 'tag', 'lefthigh');
        righthighH = line(c2+log(1/height-1)/a2+real(square), ...
            height+imag(square), ...
            'color', controlcolor, 'tag', 'righthigh');
    else
        msgStr='not a default mf type';
        statHndl=findobj(f, 'Tag', 'status');
        set(statHndl, 'String', msgStr);
        return
        %          fprintf('mf_type = %s\n', mf_type);
        %          error('Unknown MF type!');
    end
    
    % set mouse button-down function
    
    set(f,'WindowButtonDownFcn',@localButtonDownFcn);
    
case 'info',
    helpwin(mfilename);
end

%--------------------------------------------------------------------------
function localButtonDownFcn(eventSrc,eventData)
% local function for mouse button down action
%f = findobj(allchild(0),'type','figure','tag','mfedit');
f = eventSrc;

userparam=get(gca, 'Userdata');
if ~isstruct(userparam)
    return
end
curr_info = get(gca, 'CurrentPoint');
leftlowH = findobj(f, 'tag', 'leftlow');
lefthighH = findobj(f, 'tag', 'lefthigh');
centerH = findobj(f, 'tag', 'center');
righthighH = findobj(f, 'tag', 'righthigh');
rightlowH = findobj(f, 'tag', 'rightlow');
lineH = findobj(f, 'tag', 'mfline', 'Userdata', userparam.CurrMF);
allH = [leftlowH lefthighH centerH righthighH rightlowH lineH];
set(allH, 'erasemode', 'xor');
% test if inside control squares
for i = 1:length(allH)-1,
    
    set(allH(i), 'userdata', ...
        find(inpolygon(curr_info(1,1),curr_info(1,2), ...
        get(allH(i),'xdata')',get(allH(i),'ydata')')));
end
% test if clicking on the line
if isequal(gco,lineH),
    param = eval(get(findobj(f, 'tag', 'mfparams'), 'string'));
    set(findobj(f, 'tag', 'mfparams'), 'userdata', [curr_info(1,1) param]);
end

% store the current state and set the button motion function
fishist = get(f, 'Userdata');
fis = fishist{1}; % current fis
set(f,'WindowButtonUpFcn',{@localButtonUpFcn,fis},'WindowButtonMotionFcn',@localButtonMotionFcn);


%--------------------------------------------------------------------------
function localButtonMotionFcn(eventSrc,eventData)
% local function for mouse button motion action

selectColor = [1 0 0];
curr_info = get(gca, 'CurrentPoint');

%f = findobj(allchild(0),'type','figure','tag','mfedit');
f = eventSrc;

leftlowH = findobj(f, 'tag', 'leftlow');
rightlowH = findobj(f, 'tag', 'rightlow');
lefthighH = findobj(f, 'tag', 'lefthigh');
righthighH = findobj(f, 'tag', 'righthigh');
centerH = findobj(f, 'tag', 'center');
mainAxes = findobj(f, 'Tag','mainaxes');

paramLine = get(mainAxes, 'UserData');
lineH = findobj(f, 'tag', 'mfline', 'UserData', paramLine.CurrMF);
if ~isempty(lineH)
    
    mf_type = deblank(feval(mfilename, 'get_current_mf'));
    square = local_get_control_square;
    
    paramH = findobj(f, 'tag', 'mfparams');
    x = get(lineH, 'xdata');
    
    mf_type = deblank(feval(mfilename, 'get_current_mf'));
    
    paramstr=get(paramH, 'string');
    if ~isempty(deblank(paramstr))
        param = eval(paramstr);
    else
        param=[];
    end
    
    % Is the current variable input or output?
    currVarAxes=findobj(f,'Type','axes','XColor',selectColor);
    varIndex=get(currVarAxes,'UserData');
    varType=get(currVarAxes,'Tag');
    oldfis=get(f, 'Userdata');
    fis=oldfis{1};
    if strcmp(mf_type, 'trimf'),
        if  get(leftlowH, 'userdata') & curr_info(1,1) <= param(2),
            param(1) = curr_info(1,1);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', real(square) + curr_info(1));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(centerH, 'userdata') & ...
                param(1) <= curr_info(1,1) & curr_info(1,1) <= param(3),
            param(2) = curr_info(1,1);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(centerH, 'xdata', real(square) + curr_info(1));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(rightlowH, 'userdata') & param(2) <= curr_info(1,1),
            param(3) = curr_info(1,1);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(rightlowH, 'xdata', real(square) + curr_info(1,1));
            set(paramH, 'string', mat2str(param, 3));
        elseif gco == lineH,
            paramHndl = findobj(f, 'Tag', 'mfparams');
            tmp = get(paramHndl, 'Userdata');
            param = curr_info(1,1) - tmp(1) + tmp(2:length(tmp));
            y=evalmf(x, param, mf_type);
            set(lineH, 'ydata', y);
            set(leftlowH, 'xdata', real(square) + param(1));
            set(centerH, 'xdata', real(square) + param(2));
            set(rightlowH, 'xdata', real(square) + param(3));
            set(paramH, 'string', mat2str(param, 3));
        end
    elseif strcmp(mf_type, 'trapmf') | strcmp(mf_type, 'pimf'),
        %curr_info
         %   param
        if get(leftlowH, 'userdata'),
            if curr_info(1,1) <= param(2),
                param(1) = curr_info(1,1);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(leftlowH, 'xdata', real(square)+curr_info(1,1));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif get(rightlowH, 'userdata'),
            if curr_info(1,1) >= param(3),
                param(4) = curr_info(1,1);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(rightlowH, 'xdata', real(square)+curr_info(1,1));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif get(lefthighH, 'userdata'),
            if (curr_info(1,1) >= param(1)) && ((curr_info(1,1) < param(3)-sqrt(eps)))
                param(2) = curr_info(1,1);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(lefthighH, 'xdata', real(square)+curr_info(1,1));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif get(righthighH, 'userdata'),
            if (curr_info(1,1) <= param(4)) && ((curr_info(1,1) > sqrt(eps)+param(2)))
                param(3) = curr_info(1,1);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(righthighH, 'xdata', real(square)+curr_info(1,1));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif gco == lineH,
            paramHndl = findobj(f, 'Tag', 'mfparams');
            tmp = get(paramHndl, 'Userdata');
            param = curr_info(1,1) - tmp(1) + tmp(2:length(tmp));
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', real(square) + param(1));
            set(lefthighH, 'xdata', real(square) + param(2));
            set(righthighH, 'xdata', real(square) + param(3));
            set(rightlowH, 'xdata', real(square) + param(4));
            set(paramH, 'string', mat2str(param, 3));
        end
    elseif strcmp(mf_type, 'gaussmf'),
        sigma = param(1); c = param(2);
        height = 0.5;
        if get(leftlowH, 'userdata'),
            if curr_info(1,1) < c,
                param(1) = (c-curr_info(1,1))/sqrt(-2*log(height));
                sigma = param(1); c = param(2);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(leftlowH,'xdata', real(square)+curr_info(1,1));
                set(rightlowH,'xdata', real(square)+2*c-curr_info(1,1));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif get(rightlowH, 'userdata'),
            if curr_info(1,1) > c,
                param(1) = (curr_info(1,1)-c)/sqrt(-2*log(height));
                sigma = param(1); c = param(2);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(rightlowH,'xdata', real(square)+curr_info(1,1));
                set(leftlowH,'xdata', real(square)+2*c-curr_info(1,1));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif gco == lineH,
            paramHndl = findobj(f, 'Tag', 'mfparams');
            tmp = get(paramHndl, 'Userdata');
            param(2) = curr_info(1,1) - tmp(1) + tmp(3);
            sigma = param(1); c = param(2);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', real(square) + ...
                c-sigma*sqrt(-2*log(height)));
            set(rightlowH, 'xdata', real(square) + ...
                c+sigma*sqrt(-2*log(height)));
            set(paramH, 'string', mat2str(param, 3));
        end
    elseif strcmp(mf_type, 'gauss2mf'),
        s1=param(1); c1=param(2); s2=param(3); c2=param(4);
        height = 0.5;
        if get(leftlowH, 'userdata'),
            spread = param(1)*sqrt(-2*log(height));
            param(2) = curr_info(1,1)+spread;
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(lefthighH,'xdata', real(square)+param(2));
            set(leftlowH,'xdata', param(2)-spread+real(square));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(rightlowH, 'userdata'),
            spread = param(3)*sqrt(-2*log(height));
            param(4) = curr_info(1,1)-spread;
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(righthighH,'xdata', real(square)+param(4));
            set(rightlowH,'xdata', param(4)+spread+real(square));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(lefthighH, 'userdata'),
            spread = curr_info(1,1)-(c1-s1*sqrt(-2*log(height)));
            if spread > 0,
                param(1) = spread/sqrt(-2*log(height));
                param(2) = curr_info(1,1);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(lefthighH, 'xdata', real(square)+curr_info(1,1));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif get(righthighH, 'userdata'),
            spread = -(curr_info(1,1) - ...
                (c2+s2*sqrt(-2*log(height))));
            if spread > 0,
                param(3) = spread/sqrt(-2*log(height));
                param(4) = curr_info(1,1);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(righthighH, 'xdata', real(square)+curr_info(1,1));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif gco == lineH,
            paramHndl = findobj(f, 'Tag', 'mfparams');
            tmp = get(paramHndl, 'userdata');
            %    tmp = str2mat(tmpstr);
            %   tmp = get(lineH, 'userdata');
            param(2) = curr_info(1,1) - tmp(1) + tmp(3);
            param(4) = curr_info(1,1) - tmp(1) + tmp(5);
            s1=param(1); c1=param(2); s2=param(3); c2=param(4);
            height = 0.5;
            x_left = c1 - s1*sqrt(-2*log(height));
            x_right = c2 + s2*sqrt(-2*log(height));
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', x_left+real(square));
            set(rightlowH, 'xdata', x_right+real(square));
            set(lefthighH, 'xdata',  param(2)+real(square));
            set(righthighH, 'xdata',  param(4)+real(square));
            set(paramH, 'string', mat2str(param, 3));
        end
    elseif strcmp(mf_type, 'sigmf'),
        a = param(1); c = param(2);
        height = 0.1;
        if get(leftlowH, 'userdata'),
            if curr_info(1,1) == c,
                param(1) = realmax;
            else
                param(1) = -log(1/height-1)/(curr_info(1,1)-c);
            end
            a = param(1); c = param(2);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH,'xdata',real(square)+curr_info(1,1));
            set(righthighH,'xdata',real(square)+2*c-curr_info(1,1));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(righthighH, 'userdata'),
            if curr_info(1,1) == c,
                param(1) = realmax;
            else
                param(1) = -log(1/(1-height)-1)/(curr_info(1,1)-c);
            end
            a = param(1); c = param(2);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(righthighH, 'xdata', real(square)+curr_info(1,1));
            set(leftlowH, 'xdata', real(square)+2*c-curr_info(1,1));
            set(paramH, 'string', mat2str(param, 3));
        elseif gco == lineH,
            paramHndl = findobj(f, 'Tag', 'mfparams');
            tmp = get(paramHndl, 'Userdata');
            %   tmp = str2mat(tmpstr);
            %   tmp = get(lineH, 'userdata');
            param(2) = curr_info(1,1) - tmp(1) + tmp(3);
            a = param(1); c = param(2);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', ...
                c-log(1/height-1)/a + real(square));
            set(righthighH, 'xdata', ...
                c-log(1/(1-height)-1)/a + real(square));
            set(paramH, 'string', mat2str(param, 3));
        end
    elseif strcmp(mf_type, 'gbellmf'),
        height = 0.9;
        if get(leftlowH, 'userdata'),
            if curr_info(1,1) < param(3),
                param(1) = param(3)-curr_info(1,1);
                a = param(1); b = param(2); c = param(3);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(leftlowH, 'xdata', curr_info(1,1)+real(square));
                set(rightlowH, 'xdata',2*c-curr_info(1,1)+real(square));
                set(lefthighH, 'xdata', ...
                    c-a*(1/height-1)^(1/(2*b))+real(square));
                set(righthighH, 'xdata', ...
                    c+a*(1/height-1)^(1/(2*b))+real(square));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif get(rightlowH, 'userdata'),
            if curr_info(1,1) > param(3),
                param(1) = curr_info(1,1)-param(3);
                a = param(1); b = param(2); c = param(3);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(rightlowH, 'xdata', curr_info(1,1)+real(square));
                set(leftlowH, 'xdata', 2*c-curr_info(1,1)+real(square));
                set(lefthighH, 'xdata', ...
                    c-a*(1/height-1)^(1/(2*b))+real(square));
                set(righthighH, 'xdata', ...
                    c+a*(1/height-1)^(1/(2*b))+real(square));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif get(lefthighH, 'userdata'),
            tmp = abs((curr_info(1,1)-param(3))/param(1));
            if tmp == 0,
                param(2) = eps;
            elseif tmp == 1,
                param(2) = realmax;
            else
                param(2) = log(1/height-1)/(2*log(tmp));
            end
            a = param(1); b = param(2); c = param(3);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(lefthighH, 'xdata', curr_info(1,1)+real(square));
            set(righthighH, 'xdata', 2*c-curr_info(1,1)+real(square));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(righthighH, 'userdata'),
            tmp = abs((curr_info(1,1)-param(3))/param(1));
            if tmp == 0,
                param(2) = eps;
            elseif tmp == 1,
                param(2) = realmax;
            else
                param(2) = log(1/height-1)/(2*log(tmp));
            end
            a = param(1); b = param(2); c = param(3);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(righthighH, 'xdata', curr_info(1,1)+real(square));
            set(lefthighH, 'xdata', 2*c-curr_info(1,1)+real(square));
            set(paramH, 'string', mat2str(param, 3));
        elseif gco == lineH,
            paramHndl = findobj(f, 'Tag', 'mfparams');
            tmp = get(paramHndl, 'Userdata');
            %   tmp = str2mat(tmpstr);
            %   tmp = get(lineH, 'userdata');
            param(3) = curr_info(1,1) - tmp(1) + tmp(4);
            a = param(1); b = param(2); c = param(3);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', c-a+real(square));
            set(rightlowH, 'xdata', c+a+real(square));
            set(lefthighH, 'xdata', ...
                c-a*(1/height-1)^(1/(2*b)) + real(square));
            set(righthighH, 'xdata', ...
                c+a*(1/height-1)^(1/(2*b)) + real(square));
            set(paramH, 'string', mat2str(param, 3));
        end
    elseif strcmp(mf_type, 'smf'),
        if get(leftlowH, 'userdata'),
            if curr_info(1,1) <= param(2),
                param(1) = curr_info(1,1);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(leftlowH, 'xdata', curr_info(1,1)+real(square));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif get(righthighH, 'userdata'),
            if curr_info(1,1) >= param(1),
                param(2) = curr_info(1,1);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(righthighH, 'xdata', curr_info(1,1)+real(square));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif gco == lineH,
            paramHndl = findobj(f, 'Tag', 'mfparams');
            tmp = get(paramHndl, 'Userdata');
            % tmp = str2mat(tmpstr);
            % tmp = get(lineH, 'userdata');
            param = curr_info(1,1) - tmp(1) + tmp(2:3);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', param(1)+real(square));
            set(righthighH, 'xdata', param(2)+real(square));
            set(paramH, 'string', mat2str(param, 3));
        end
    elseif strcmp(mf_type, 'zmf'),
        if get(lefthighH, 'userdata'),
            if curr_info(1,1) <= param(2),
                param(1) = curr_info(1,1);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(lefthighH, 'xdata', curr_info(1,1)+real(square));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif get(rightlowH, 'userdata'),
            if curr_info(1,1) >= param(1),
                param(2) = curr_info(1,1);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(rightlowH, 'xdata', curr_info(1,1)+real(square));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif gco == lineH,
            paramHndl = findobj(f, 'Tag', 'mfparams');
            tmp = get(paramHndl, 'Userdata');
            %     tmp = str2mat(tmpstr);
            %     tmp = get(lineH, 'userdata');
            param = curr_info(1,1) - tmp(1) + tmp(2:3);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(lefthighH, 'xdata', param(1)+real(square));
            set(rightlowH, 'xdata', param(2)+real(square));
            set(paramH, 'string', mat2str(param, 3));
        end
    elseif strcmp(mf_type, 'psigmf'),
        height = 0.9;
        if get(leftlowH, 'userdata'),
            param(2) = curr_info(1,1);
            a1=param(1); c1=param(2); a2=param(3); c2=param(4);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', curr_info(1,1)+real(square));
            set(lefthighH, 'xdata',c1-log(1/height-1)/a1+real(square));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(rightlowH, 'userdata'),
            param(4) = curr_info(1,1);
            a1=param(1); c1=param(2); a2=param(3); c2=param(4);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(rightlowH, 'xdata', curr_info(1,1)+real(square));
            set(righthighH, 'xdata',c2-log(1/height-1)/a2+real(square));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(lefthighH, 'userdata'),
            %if curr_info(1,1) == param(2),
            %       param(1) = realmax;
            %else
            %       param(1) = -log(1/height-1)/(curr_info(1,1)-param(2));
            %end
            if curr_info(1,1) > param(2),
                param(1) = -log(1/height-1)/(curr_info(1,1)-param(2));
                a = param(1); c = param(2);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(lefthighH, 'xdata', real(square)+curr_info(1,1));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif get(righthighH, 'userdata'),
            %if curr_info(1,1) == param(4),
            %       param(3) = realmax;
            %else
            %       param(3) = -log(1/height-1)/(curr_info(1,1)-param(4));
            %end
            if curr_info(1,1) < param(4),
                param(3) = -log(1/height-1)/(curr_info(1,1)-param(4));
                a = param(3); c = param(4);
                set(lineH, 'ydata', evalmf(x, param, mf_type));
                set(righthighH, 'xdata', real(square)+curr_info(1,1));
                set(paramH, 'string', mat2str(param, 3));
            end
        elseif gco == lineH,
            paramHndl = findobj(f, 'Tag', 'mfparams');
            tmp = get(paramHndl, 'Userdata');
            param(2) = curr_info(1,1) - tmp(1) + tmp(3);
            param(4) = curr_info(1,1) - tmp(1) + tmp(5);
            a1=param(1); c1=param(2); a2=param(3); c2=param(4);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', c1+real(square));
            set(rightlowH, 'xdata', c2+real(square));
            set(lefthighH, 'xdata', ...
                c1-log(1/height-1)/a1+real(square));
            set(righthighH, 'xdata', ...
                c2-log(1/height-1)/a2+real(square));
            set(paramH, 'string', mat2str(param, 3));
        end
    elseif strcmp(mf_type, 'dsigmf'),
        height = 0.9;
        if get(leftlowH, 'userdata'),
            param(2) = curr_info(1,1);
            a1=param(1); c1=param(2); a2=param(3); c2=param(4);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', curr_info(1,1)+real(square));
            set(lefthighH, 'xdata',c1-log(1/height-1)/a1+real(square));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(rightlowH, 'userdata'),
            param(4) = curr_info(1,1);
            a1=param(1); c1=param(2); a2=param(3); c2=param(4);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(rightlowH, 'xdata', curr_info(1,1)+real(square));
            set(righthighH, 'xdata',c2+log(1/height-1)/a2+real(square));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(lefthighH, 'userdata'),
            if curr_info(1,1) == param(2),
                param(1) = realmax;
            else
                param(1) = -log(1/height-1)/(curr_info(1,1)-param(2));
            end
            a = param(1); c = param(2);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(lefthighH, 'xdata', real(square)+curr_info(1,1));
            set(paramH, 'string', mat2str(param, 3));
        elseif get(righthighH, 'userdata'),
            if curr_info(1,1) == param(4),
                param(3) = realmax;
            else
                param(3) = log(1/height-1)/(curr_info(1,1)-param(4));
            end
            a = param(3); c = param(4);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(righthighH, 'xdata', real(square)+curr_info(1,1));
            set(paramH, 'string', mat2str(param, 3));
        elseif gco == lineH,
            paramHndl = findobj(f, 'Tag', 'mfparams');
            tmp = get(paramHndl, 'Userdata');
            param(2) = curr_info(1,1) - tmp(1) + tmp(3);
            param(4) = curr_info(1,1) - tmp(1) + tmp(5);
            a1=param(1); c1=param(2); a2=param(3); c2=param(4);
            set(lineH, 'ydata', evalmf(x, param, mf_type));
            set(leftlowH, 'xdata', c1+real(square));
            set(rightlowH, 'xdata', c2+real(square));
            set(lefthighH, 'xdata', ...
                c1-log(1/height-1)/a1+real(square));
            set(righthighH, 'xdata', ...
                c2+log(1/height-1)/a2+real(square));
            set(paramH, 'string', mat2str(param, 3));
        end
    else
        error('Unknown MF type!');
    end
    %      y=evalmf(x, param, mf_type);
    %      centerIndex=find(y==max(y));
    %      centerIndex=round(mean(centerIndex));
    %      textHndl=findobj(gcf, 'Tag', 'mftext', 'Userdata', paramLine.CurrMF);
    %      set(textHndl, 'Position', [x(centerIndex), 1.1, 0]);
    
    fis.(varType)(varIndex).mf(paramLine.CurrMF).params = param;
    
    % update the most recent state.
    oldfis{1} = fis;
    set(f, 'Userdata', oldfis);
end

%---------------------------------------------------------
function localButtonUpFcn(eventSrc,eventData,storedfis)
% local function for mouse button up action

%f = findobj(allchild(0),'type','figure','tag','mfedit');
f = eventSrc;

leftlowH = findobj(f, 'tag', 'leftlow');
lefthighH = findobj(f, 'tag', 'lefthigh');
centerH = findobj(f, 'tag', 'center');
righthighH = findobj(f, 'tag', 'righthigh');
rightlowH = findobj(f, 'tag', 'rightlow');
lineH = findobj(f, 'tag', 'mfline');
allH = [leftlowH lefthighH centerH righthighH rightlowH];  % lineH'];
set(allH, 'erasemode', 'normal', 'userdata', []);
oldfis = get(f, 'Userdata');
currentfis = oldfis{1};
if ~isequalwithequalnans(currentfis,storedfis) % REVISIT: isequalwithequalnans 
    oldfis{1} = storedfis;
    set(f, 'Userdata',oldfis);
    pushundo(f,currentfis);
    updtfis(f,currentfis,[4 5 6]);
end
param=get(findobj(f, 'Tag', 'mainaxes'), 'Userdata');
textHndl=findobj(f, 'Tag', 'mftext', 'Userdata', param.CurrMF);
lineHndl=findobj(f, 'Tag', 'mfline', 'Userdata', param.CurrMF);
if ~isempty(lineHndl)
    y=get(lineHndl, 'Ydata');
    x=get(lineHndl, 'Xdata');
    centerIndex=find(y==max(y));
    centerIndex=round(mean(centerIndex));
    set(textHndl, 'Position', [x(centerIndex), 1.1, 0]);
end
set(f,'WindowButtonMotionFcn','');

%--------------------------------------------------------------------------
function out = local_get_control_square
% create a perfect square

set(gca, 'unit', 'pixel');
axes_pos = get(gca, 'pos'); w = axes_pos(3); h = axes_pos(4);
out = 0.02*([-1 1 1 -1 -1]*h/w*...
    (max(get(gca, 'xlim'))- min(get(gca, 'xlim')))/...
    (max(get(gca, 'ylim'))- min(get(gca, 'ylim'))) +...
    sqrt(-1)*[-1 -1 1 1 -1]);
set(gca, 'unit', 'normalize');