来源: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. 08.简单学习redis哨兵主备切换和选举算法

    一.选举的授权 每次一个哨兵要做主备切换,首先需要quorum数量的哨兵认为odown,然后选举出一个哨兵来做切换,这个哨兵还得得到majority哨兵的授权,才能正式执行切换 如果quorum &l ...

  2. 硬盘网盘U盘全部可以丢掉了,这个设备可以让你享受随身带着几个T的感受

    前言 有小伙伴问我,你怎么老写技术类文章,能不能写点别的. 其实我兴趣挺广泛的,早年还有机会做个游戏博主,可惜最近2年金盆洗手了.戒了手游,ns和ps4都在吃灰.能完整玩完的游戏屈指可数.但是对于折腾 ...

  3. .net core 返回业务错误(不抛异常)

    在开始之前你需要知道: 1.通过抛异常--全局捕获异常的方式返回业务错误信息性能是非常差的(不知道为什么的可以百度一下) 2.如何将错误信息绑定到mvc模型验证中 自定义返回内容 //返回内容接口 p ...

  4. [工作积累] shadowmap 改进

    前面几篇阴影相关的: https://www.cnblogs.com/crazii/p/5443534.html 这个是在做bh3 MMD角色自阴影时的笔记 https://www.cnblogs.c ...

  5. 单元测试框架 python

    1.为什么要做单元测试 单元测试更细致.更有针对性 单元测试能测试到很多系统测试无法达到的测试 单元测试是在编码中做的测试,发现问题方便修改,而系统测试的问题修改成本可能变高 单元测试是自动化测试 2 ...

  6. POJ - 3037-Skiing(邻接表+Dijkstra)

    Bessie and the rest of Farmer John's cows are taking a trip this winter to go skiing. One day Bessie ...

  7. HDU多校-1004-Vacation(思维)

    Tom and Jerry are going on a vacation. They are now driving on a one-way road and several cars are i ...

  8. 关于ASP.NET MVC的权限认证的一些总结

    最近在学ASP.NET MVC的权限认证的一些东西,上网搜索了一阵,发现网上的方法大多数是以下几类: 一.FormsAuthentication.SetAuthCookie(admin.Name, f ...

  9. 剑指 Offer 55 - II. 平衡二叉树

    题目描述 输入一棵二叉树的根节点,判断该树是不是平衡二叉树.如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 示例1: 给定二叉树 [3,9,20,null,null,1 ...

  10. Spring Boot 整合Redis 实现缓存

      本文提纲 一.缓存的应用场景 二.更新缓存的策略 三.运行 springboot-mybatis-redis 工程案例 四.springboot-mybatis-redis 工程代码配置详解   ...