1. 程式人生 > >MATLAB滑鼠事件應用(記錄)

MATLAB滑鼠事件應用(記錄)

前記:

      人機互動的方式--鍵盤開關、滑鼠、觸控式螢幕、體感感測器(Kinect、leap motion)等的使用大大促進人與機器的交流過程。

這裡記錄滑鼠事件與MATLAB的結合,為後期機器人模擬控制打下基礎---如滑鼠直接拖動機器人運動(像很多機器人模擬軟體裡的作用一樣,如Robotstudio、soldworks、proe\core、Adams等)。

1、滑鼠畫矩形

   程式碼功能:執行程式碼在出現的figure視窗,點選滑鼠畫出矩形

k = waitforbuttonpress;
point1 = get(gca,'CurrentPoint');    % button down detected
finalRect = rbbox;                   % return figure units
point2 = get(gca,'CurrentPoint');    % button up detected
point1 = point1(1,1:2);              % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2);             % calculate locations
offset = abs(point1-point2);         % and dimensions
x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)];
y = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)];
hold on
axis manual
plot(x,y)

                                                        

2、滑鼠拖動直線

 function main
f =figure;
aH=axes('Xlim',[0 1],'Ylim',[0 1]);
h=line([0.5 0.5],[0 1],...
          'color','red',...
          'linewidth',4,...
          'ButtonDownFcn',@startDragFcn);
 set(f,'WindowButtonUpFcn',@startDragFcn);
 function startDragFcn(varargin)
      set(f,'WindowButtonMotionFcn',@draggingFcn);
 end
 function draggingFcn(varargin)
      pt=get(aH,'CurrentPoint');
      set(h,'Xdata',pt(1)*[1 1]);
 end
 function stopDragFcn(varargin)
     set(f,'WindowButtonMotionFcn','');
 end
 end
                                                  

3、顯示座標

function ff
x = 5:30;
y = x.^2-40.*x+400;
plot(x,y);
axis([5,30,-50,250]);
  
tb = text;
set(gcf, 'WindowButtonMotionFcn', @callback);
  
function callback(hObject, event)
    loc = get(gca, 'CurrentPoint');
    loc = loc([1 3]);
    set(tb, 'string', num2str(loc), 'position', loc);
end
end

                                                  

4、畫軌跡並儲存點座標

function  MouseDraw(action)
% MouseDraw 本例展示如何以Handle Graphics來設定滑鼠事件
% (MouseDraw Events)的反應指令(Callbacks)

% 本程式在滑鼠移動非常快時,不會造成畫“斷線”
% global不能傳矩陣
global InitialX InitialY FigHandle
if nargin == 0, action = 'start';   
end

switch(action)
    %%開啟圖形視窗
    case 'start'
        FigHandle = figure('WindowButtonDownFcn','MouseDraw down');
        axis([-600 600 -600 600]);    % 設定圖軸範圍
%         axis off;
        grid on;
        box on;     % 將圖軸加上圖框
        title('手寫體輸入窗');
% %         fprintf('start');
        %%設定滑鼠按鈕被按下時的反應指令為「MouseDraw down」
        % set(gcf, 'WindowButtonDownFcn', 'MouseDraw down');  
        dlmwrite('IXT.txt', 10, 'delimiter', '\t', 'precision', 10);
        dlmwrite('IZT.txt', 10, 'delimiter', '\t', 'precision', 10);
        %%滑鼠按鈕被按下時的反應指令
    case 'down'
        if strcmp(get(FigHandle, 'SelectionType'), 'normal')    %如果是左鍵
            set(FigHandle,'pointer','hand');      
            CurPiont = get(gca, 'CurrentPoint');
            InitialX = CurPiont(1,1);
            InitialY = CurPiont(1,2);
            dlmwrite('IXT.txt', InitialX, '-append', 'delimiter', '\t', 'precision', 10);
            dlmwrite('IZT.txt', InitialY, '-append', 'delimiter', '\t', 'precision', 10);
            % 列印「MouseDraw down!」訊息
% %             fprintf('MouseDraw down!\n');
            % 設定滑鼠移動時的反應指令為「MouseDraw move」
            set(gcf, 'WindowButtonMotionFcn', 'MouseDraw move');
            set(gcf, 'WindowButtonUpFcn', 'MouseDraw up');
        elseif strcmp(get(FigHandle, 'SelectionType'), 'alt')   % 如果是右鍵
            set(FigHandle, 'Pointer', 'arrow');
            set( FigHandle, 'WindowButtonMotionFcn', '')
            set(FigHandle, 'WindowButtonUpFcn', '')
            fprintf('MouseDraw right button down!\n');
            ImageX = importdata('IXT.txt');
            ImageY = importdata('IZT.txt');
            InputImage = ones(imSize);
            roundX = round(ImageX);
            roundY = round(ImageY);
            for k = 1:size(ImageX,1)
                if 0<roundX(k) && roundX(k)<imSize && 0<roundY(k) && roundY(k)<imSize
                    InputImage(roundX(k)-1:roundX(k)+2, roundY(k)-1:roundY(k)+2) = 0;
                end
            end
            InputImage = imrotate(InputImage,180);       % 影象旋轉
            figure(2);
            imshow(InputImage);
        end
    %%滑鼠移動時的反應指令
    case 'move'
        CurPiont = get(gca, 'CurrentPoint');
        X = CurPiont(1,1);
        Y = CurPiont(1,2);
        % 當滑鼠移動較快時,不會出現離散點。
        % 利用y=kx+b直線方程實現。
        x_gap = 1;    % 定義x方向增量
        y_gap = 1;    % 定義y方向增量
        if X > InitialX
            step_x = x_gap;
        else
            step_x = -x_gap;
        end
        if Y > InitialY
            step_y = y_gap;
        else
            step_y = -y_gap;
        end  
        % 定義x,y的變化範圍和步長
        if abs(X-InitialX) < 0.1        % 線平行於y軸,即斜率不存在時
            iy = InitialY:step_y:Y;
            ix = X.*ones(1,size(iy,2));
        else
            ix = InitialX:step_x:X ;    % 定義x的變化範圍和步長
            % 當斜率存在,即k = (Y-InitialY)/(X-InitialX) ~= 0
            iy = (Y-InitialY)/(X-InitialX).*(ix-InitialX)+InitialY;   
        end
        ImageX = [ix, X]; 
        ImageY = cat(2, iy, Y);
        line(ImageX,ImageY, 'marker', '.', 'markerSize',1, ...
            'LineStyle', '-', 'LineWidth', 2, 'Color', 'Blue');
        dlmwrite('IXT.txt', ImageX, '-append', 'delimiter', '\t', 'precision', 10);
        dlmwrite('IZT.txt', ImageY, '-append', 'delimiter', '\t', 'precision',10);
        InitialX = X;       %記住當前點座標
        InitialY = Y;       %記住當前點座標
        % 列印「MouseDraw is moving!」及滑鼠現在位置
        % fprintf('MouseDraw is moving! Current location = (%g, %g)\n', ...
          % CurPiont(1,1), CurPiont(1,2));
% %         fprintf('MouseDraw move!\n');
        % 設定滑鼠按鈕被釋放時的反應指令為「MouseDraw up」
        % set(gcf, 'WindowButtonUpFcn', 'MouseDraw up');
    %%滑鼠按鈕被釋放時的反應指令
    case 'up'
        % 清除滑鼠移動時的反應指令
        set(gcf, 'WindowButtonMotionFcn', '');
        % 清除滑鼠按鈕被釋放時的反應指令
        set(gcf, 'WindowButtonUpFcn', '');
        % 列印「MouseDraw up!」
% %         fprintf('MouseDraw up!\n');
end

end

                                               

5、也是拖動直線的,不過一個拖動時,另一個不動。點選show position...在命令列返回數值(因為有GUI所以打包放在我的資源裡了,需要的自己下)點選開啟連結

        

6、後記

以上為網上資源的收集,主要是供自己學習。如果碰巧你需要,甚幸~.~ //