MATLAB鼠标事件

MATLAB鼠标事件,第1张

MATLAB鼠标事件

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

前记:

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


这里记录鼠标事件与MATLAB的结合,为后期机器人仿真控制打下基础---如鼠标直接拖动机器人运动(像很多机器人仿真软件里的作用一样,如Robotstudio、soldworks、proe\core、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', '\t', 'precision', 10);
  24.   dlmwrite('IZT.txt', 10, 'delimiter', '\t', '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', '\t', 'precision', 10);
  33.   dlmwrite('IZT.txt', InitialY, '-append', 'delimiter', '\t', 'precision', 10);
  34.   % 列印「MouseDraw down!」讯息
  35.   % % fprintf('MouseDraw down!\n');
  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!\n');
  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、后记

以上为网上资源的收集,主要是供自己学习。


如果碰巧你需要,甚幸~.~ //

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/588633.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存