来源: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、后记

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

 

MATLAB鼠标事件的更多相关文章

  1. 7.JAVA之GUI编程鼠标事件

    鼠标事件: 功能: 1.基本窗体功能实现 2.鼠标移动监听,当鼠标移动到按钮上时,触发打印事件. 3.按钮活动监听,当按钮活动时,触发打印事件. 4.按钮被单击时触发打印事件. 源码如下: impor ...

  2. 手持设备点击响应速度,鼠标事件与touch事件的那些事

    前言 现在一直在做移动端的开发,这次将单页应用的网页内嵌入了app,于是老大反映了一个问题:app应用点击响应慢!我开始不以为然,于是拿着网页版的试了试,好像确实有一定延迟,于是开始了研究,最后选择了 ...

  3. css屏蔽元素的鼠标事件pointer-events

    // 屏蔽点击 $('body').css('pointer-events', 'none'); //恢复默认 $('body').css('pointer-events', 'auto');   用 ...

  4. 深入学习jQuery鼠标事件

    × 目录 [1]类型 [2]写法 [3]合成事件[4]鼠标按键[5]修改键[6]坐标位置 前面的话 鼠标事件是DOM事件中最常用的事件,jQuery对鼠标事件进行了封装和扩展.本文将详细介绍jQuer ...

  5. 深入理解DOM事件类型系列第一篇——鼠标事件

    × 目录 [1]类型 [2]顺序 [3]坐标位置[4]修改键[5]相关元素[6]鼠标按键[7]滚轮事件[8]移动设备 前面的话 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备.本文 ...

  6. winform/窗体鼠标事件编程中的几个问题

    1.进行.net窗体的开发,经常用到鼠标事件,如MouseDown/MouseUp/MouseMove/MouseClick等.可是有时候给控件添加鼠标事件,就是不响应,怎么办呢! 答案:1.控件是否 ...

  7. JQuery事件之鼠标事件

    鼠标事件是在用户移动鼠标光标或者使用任意鼠标键点击时触发的. ():click事件:click事件于用户在元素敲击鼠标左键,并在相同元素上松开左键时触发. $('p').click(function( ...

  8. SDL鼠标事件

    鼠标事件有这么多种,手柄的可以忽视,Sdl.SDL_KEYDOWN,Sdl.SDL_KEYUP,Sdl.SDL_MOUSEMOTION,Sdl.SDL_MOUSEBUTTONDOWN,Sdl.SDL_ ...

  9. c#全局鼠标事件以及鼠标事件模拟

    最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...

随机推荐

  1. Java/后端学习路线

    点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...

  2. Android开发之AlertDialog警告提示框删除与取消 详解代码

    package cc.jiusansec.www; import android.app.Activity; import android.app.AlertDialog; import androi ...

  3. [] !== [] is true

    这周工作看见一个小伙伴给我私信发了这样的一个问题,我深剖了一下,希望大家能早点脱掉这个坑. Question: 如果定义了一个空数组,在开发过程中经常会做这样的一个判断,就是这个数组里发生变化不再是空 ...

  4. Fitness - 05.22

    终于到了连续熬夜,感觉身心俱疲的年纪了. 今天休息一天,瑜伽暂停. 调整作息时间,12点睡觉,5点起床学习~

  5. python文件操作、查看路径、查看文件名

    1 # -*- coding: utf-8 -* # from sys import argv # script,input_file = argv import os file_url = &quo ...

  6. Rng(求逆元)

    Problem Description Avin is studying how to synthesize data. Given an integer n, he constructs an in ...

  7. jQuery 如何实现 模糊搜索

    如何实现 模糊搜索 当我们浏览网页的时候,通常能看到搜索栏,这大大的提高了我们获取数据的目的性.那如何去实现一个简单的模糊搜索 框呢,以下案例获取能给你一点思路. 以下案例,可以实现当按键按下时,自动 ...

  8. redis基础数据结构及编码方式

    redis基础数据结构和编码方式 一.基础数据结构 1)简单动态字符串 2)双端链表 3)字典 4)跳跃表 5)整数集合 6)压缩列表 二.对象类型与编码 在redis的数据库中创建一个新的键值对时, ...

  9. 自定义线程池ThreadPoolExecutor

    使用自定义的方式创建线程池 Java本身提供的获取线程池的方式 使用Executors直接获取线程池,注意,前四个方式的底层都是通过new ThreadPoolExecutor()的方式创建的线程池, ...

  10. php cookie及session

    1.会话控制概括 1)http协议的缺陷 无状态,就是无记忆,不能让同一浏览器和服务器进行多次数据交换时,产生业务的连续性, 2)什么是会话控制 会话控制就是解决http无记忆缺陷的,能够==将数据持 ...