zoukankan      html  css  js  c++  java
  • MATLAB鼠标事件

    来源:https://blog.csdn.net/weixin_39090239/article/details/80586930

    前记:

          人机交互的方式--键盘开关、鼠标、触摸屏、体感传感器(Kinect、leap motion)等的使用大大促进人与机器的交流过程。

    这里记录鼠标事件与MATLAB的结合,为后期机器人仿真控制打下基础---如鼠标直接拖动机器人运动(像很多机器人仿真软件里的作用一样,如Robotstudio、soldworks、proecore、Adams等)。

    1、鼠标画矩形

       代码功能:运行代码在出现的figure窗口,点击鼠标画出矩形

    1.  
      k = waitforbuttonpress;
    2.  
      point1 = get(gca,'CurrentPoint'); % button down detected
    3.  
      finalRect = rbbox; % return figure units
    4.  
      point2 = get(gca,'CurrentPoint'); % button up detected
    5.  
      point1 = point1(1,1:2); % extract x and y
    6.  
      point2 = point2(1,1:2);
    7.  
      p1 = min(point1,point2); % calculate locations
    8.  
      offset = abs(point1-point2); % and dimensions
    9.  
      x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)];
    10.  
      y = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)];
    11.  
      hold on
    12.  
      axis manual
    13.  
      plot(x,y)

                                                            

    2、鼠标拖动直线

    1.  
      function main
    2.  
      f =figure;
    3.  
      aH=axes('Xlim',[0 1],'Ylim',[0 1]);
    4.  
      h=line([0.5 0.5],[0 1],...
    5.  
      'color','red',...
    6.  
      'linewidth',4,...
    7.  
      'ButtonDownFcn',@startDragFcn);
    8.  
      set(f,'WindowButtonUpFcn',@startDragFcn);
    9.  
      function startDragFcn(varargin)
    10.  
      set(f,'WindowButtonMotionFcn',@draggingFcn);
    11.  
      end
    12.  
      function draggingFcn(varargin)
    13.  
      pt=get(aH,'CurrentPoint');
    14.  
      set(h,'Xdata',pt(1)*[1 1]);
    15.  
      end
    16.  
      function stopDragFcn(varargin)
    17.  
      set(f,'WindowButtonMotionFcn','');
    18.  
      end
    19.  
      end
                                                      

    3、显示坐标

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

                                                      

    4、画轨迹并保存点坐标

    1.  
      function MouseDraw(action)
    2.  
      % MouseDraw 本例展示如何以Handle Graphics来设定滑鼠事件
    3.  
      % (MouseDraw Events)的反应指令(Callbacks)
    4.  
       
    5.  
      % 本程序在鼠标移动非常快时,不会造成画“断线”
    6.  
      % global不能传矩阵
    7.  
      global InitialX InitialY FigHandle
    8.  
      if nargin == 0, action = 'start';
    9.  
      end
    10.  
       
    11.  
      switch(action)
    12.  
      %%开启图形视窗
    13.  
      case 'start'
    14.  
      FigHandle = figure('WindowButtonDownFcn','MouseDraw down');
    15.  
      axis([-600 600 -600 600]); % 设定图轴范围
    16.  
      % axis off;
    17.  
      grid on;
    18.  
      box on; % 将图轴加上图框
    19.  
      title('手写体输入窗');
    20.  
      % % fprintf('start');
    21.  
      %%设定滑鼠按钮被按下时的反应指令为「MouseDraw down」
    22.  
      % set(gcf, 'WindowButtonDownFcn', 'MouseDraw down');
    23.  
      dlmwrite('IXT.txt', 10, 'delimiter', ' ', 'precision', 10);
    24.  
      dlmwrite('IZT.txt', 10, 'delimiter', ' ', 'precision', 10);
    25.  
      %%滑鼠按钮被按下时的反应指令
    26.  
      case 'down'
    27.  
      if strcmp(get(FigHandle, 'SelectionType'), 'normal') %如果是左键
    28.  
      set(FigHandle,'pointer','hand');
    29.  
      CurPiont = get(gca, 'CurrentPoint');
    30.  
      InitialX = CurPiont(1,1);
    31.  
      InitialY = CurPiont(1,2);
    32.  
      dlmwrite('IXT.txt', InitialX, '-append', 'delimiter', ' ', 'precision', 10);
    33.  
      dlmwrite('IZT.txt', InitialY, '-append', 'delimiter', ' ', 'precision', 10);
    34.  
      % 列印「MouseDraw down!」讯息
    35.  
      % % fprintf('MouseDraw down! ');
    36.  
      % 设定滑鼠移动时的反应指令为「MouseDraw move」
    37.  
      set(gcf, 'WindowButtonMotionFcn', 'MouseDraw move');
    38.  
      set(gcf, 'WindowButtonUpFcn', 'MouseDraw up');
    39.  
      elseif strcmp(get(FigHandle, 'SelectionType'), 'alt') % 如果是右键
    40.  
      set(FigHandle, 'Pointer', 'arrow');
    41.  
      set( FigHandle, 'WindowButtonMotionFcn', '')
    42.  
      set(FigHandle, 'WindowButtonUpFcn', '')
    43.  
      fprintf('MouseDraw right button down! ');
    44.  
      ImageX = importdata('IXT.txt');
    45.  
      ImageY = importdata('IZT.txt');
    46.  
      InputImage = ones(imSize);
    47.  
      roundX = round(ImageX);
    48.  
      roundY = round(ImageY);
    49.  
      for k = 1:size(ImageX,1)
    50.  
      if 0<roundX(k) && roundX(k)<imSize && 0<roundY(k) && roundY(k)<imSize
    51.  
      InputImage(roundX(k)-1:roundX(k)+2, roundY(k)-1:roundY(k)+2) = 0;
    52.  
      end
    53.  
      end
    54.  
      InputImage = imrotate(InputImage,180); % 图像旋转
    55.  
      figure(2);
    56.  
      imshow(InputImage);
    57.  
      end
    58.  
      %%滑鼠移动时的反应指令
    59.  
      case 'move'
    60.  
      CurPiont = get(gca, 'CurrentPoint');
    61.  
      X = CurPiont(1,1);
    62.  
      Y = CurPiont(1,2);
    63.  
      % 当鼠标移动较快时,不会出现离散点。
    64.  
      % 利用y=kx+b直线方程实现。
    65.  
      x_gap = 1; % 定义x方向增量
    66.  
      y_gap = 1; % 定义y方向增量
    67.  
      if X > InitialX
    68.  
      step_x = x_gap;
    69.  
      else
    70.  
      step_x = -x_gap;
    71.  
      end
    72.  
      if Y > InitialY
    73.  
      step_y = y_gap;
    74.  
      else
    75.  
      step_y = -y_gap;
    76.  
      end
    77.  
      % 定义x,y的变化范围和步长
    78.  
      if abs(X-InitialX) < 0.1 % 线平行于y轴,即斜率不存在时
    79.  
      iy = InitialY:step_y:Y;
    80.  
      ix = X.*ones(1,size(iy,2));
    81.  
      else
    82.  
      ix = InitialX:step_x:X ; % 定义x的变化范围和步长
    83.  
      % 当斜率存在,即k = (Y-InitialY)/(X-InitialX) ~= 0
    84.  
      iy = (Y-InitialY)/(X-InitialX).*(ix-InitialX)+InitialY;
    85.  
      end
    86.  
      ImageX = [ix, X];
    87.  
      ImageY = cat(2, iy, Y);
    88.  
      line(ImageX,ImageY, 'marker', '.', 'markerSize',1, ...
    89.  
      'LineStyle', '-', 'LineWidth', 2, 'Color', 'Blue');
    90.  
      dlmwrite('IXT.txt', ImageX, '-append', 'delimiter', 't', 'precision', 10);
    91.  
      dlmwrite('IZT.txt', ImageY, '-append', 'delimiter', 't', 'precision',10);
    92.  
      InitialX = X; %记住当前点坐标
    93.  
      InitialY = Y; %记住当前点坐标
    94.  
      % 列印「MouseDraw is moving!」及滑鼠现在位置
    95.  
      % fprintf('MouseDraw is moving! Current location = (%g, %g)n', ...
    96.  
      % CurPiont(1,1), CurPiont(1,2));
    97.  
      % % fprintf('MouseDraw move!n');
    98.  
      % 设定滑鼠按钮被释放时的反应指令为「MouseDraw up」
    99.  
      % set(gcf, 'WindowButtonUpFcn', 'MouseDraw up');
    100.  
      %%滑鼠按钮被释放时的反应指令
    101.  
      case 'up'
    102.  
      % 清除滑鼠移动时的反应指令
    103.  
      set(gcf, 'WindowButtonMotionFcn', '');
    104.  
      % 清除滑鼠按钮被释放时的反应指令
    105.  
      set(gcf, 'WindowButtonUpFcn', '');
    106.  
      % 列印「MouseDraw up!」
    107.  
      % % fprintf('MouseDraw up!n');
    108.  
      end
    109.  
       
    110.  
      end
    111.  
       

                                                   

    5、也是拖动直线的,不过一个拖动时,另一个不动。点击show position...在命令行返回数值(因为有GUI所以打包放在我的资源里了,需要的自己下)点击打开链接

            

    6、后记

    以上为网上资源的收集,主要是供自己学习。如果碰巧你需要,甚幸~.~ //

     
  • 相关阅读:
    StreamWrite写ASCII文本文件时,中文变成问号的处理
    asp.net错误处理封装
    C#减少图片文件大小和尺寸
    关于《代码大全2》
    关于重载
    Oracle移机
    用delphi模仿.net的string.split
    Oracle817搞怪
    oracle取得系统时钟
    15 个新鲜精彩的jQuery教程
  • 原文地址:https://www.cnblogs.com/MCSFX/p/11982765.html
Copyright © 2011-2022 走看看