Matlab实现鼠标光标变成爱心和瞄准镜形状

目录
  • 原理解释
    • PointerShapeCData
    • PointerShapeHotSpot
  • 创建mat文件并调用
    • 该程序的代码
    • mat文件的调用
  • PNG图片转换为光标矩阵

宝~你快看,我连鼠标光标都是爱你的形状:

不爱的话就变成狙击镜的形状!!

我买了个小风车:

那么这些各种各样的形状的鼠标光标是咋设置的嘞?

原理解释

众所周知MATLAB中的光标形状可以通过如下的方式自定义:

set(gcf,'Pointer','cross')

但能定义的种类非常有限,只有这么几种:‘arrow’ | ‘ibeam’ | ‘crosshair’ | ‘watch’ | ‘topl’ | ‘topr’ | ‘botl’ | ‘botr’ | ‘circle’ | ‘cross’ | ‘fleur’ | ‘custom’ | ‘left’ | ‘top’ | ‘right’ | ‘bottom’ | ‘hand’。

但这里面有一个叫做custom的东西,可以支持我们自己制作光标图形,

首先我们运行一下如下代码:

P=ones(16,16)* NaN ;
P(1,5)=1;P(2:14,4)=1;P(15,5)=1;P(16,6:11)=1;P(15,12)=1;P(9:14,13)=1;
P(2:9,6)=1;P(9,7)=1;P(8,8)=1;P(9,9)=1;P(8,10)=1;P(9,11)=1;P(8,12)=1;
P(2:14,5)=2;P(10:15,6:11)=2;P(9,8)=2;P(9,10)=2;P(9:14,12)=2;
set(gcf,'Pointer','Custom','PointerShapeCData',P,'PointerShapeHotSpot',[2,5])

会发现光标变成了这样:

我们来看参数的含义:

PointerShapeCData

鼠标颜色矩阵,透明处为nan,黑色处为1,白色处为2,实际上代码中的变量P是长这样的:

PointerShapeHotSpot

热点,即鼠标点击时的作用点,如下图所示,假如我们矩阵是这样16x16的,若是将热点设置为[2,5],则点击时实际点击的位置就是图中红色方块的位置。

创建mat文件并调用

因为画图像凭感觉画肯定是画不好的,因此我写了个小程序用来构造颜色矩阵:

  • 使用   移动红叉
  • 使用按键1填充数值1
  • 使用按键2填充数值2
  • 使用按键n填充nan,也就是画错的地方可以通过该按键消除掉
  • 使用按键s存储为mat文件

该程序的代码

function createPSCD
pointerSize=32;
ax=gca;hold on;

ax.XLim=[0,pointerSize]+.5;
ax.YLim=[0,pointerSize]+.5;
ax.XTick=.5:1:pointerSize+.5;
ax.YTick=.5:1:pointerSize+.5;
ax.XGrid='on';
ax.YGrid='on';
ax.XTickLabel='';
ax.YTickLabel='';
ax.PlotBoxAspectRatio=[1,1,1];

plot([0,pointerSize]+.5,[1,1].*(1+pointerSize)./2,'LineWidth',1.5,'Color',[0,0,0,.5]);
plot([1,1].*(1+pointerSize)./2,[0,pointerSize]+.5,'LineWidth',1.5,'Color',[0,0,0,.5]);
rcross=plot(8,8,'rx','LineWidth',2,'MarkerSize',14);
bshandle=scatter([],[],200,'s','filled','CData',[0,0,0]);
gshandle=scatter([],[],200,'s','filled','CData',[.8,.8,.8]);
pointer=zeros(pointerSize).*nan;

set(gcf,'KeyPressFcn',@keyPressFcn) 
    function keyPressFcn(~,event)
        switch event.Key
            case 'uparrow',rcross.YData=rcross.YData+1;
            case 'downarrow',rcross.YData=rcross.YData-1;
            case 'leftarrow',rcross.XData=rcross.XData-1;
            case 'rightarrow',rcross.XData=rcross.XData+1;  
            case '1'
                pointer(pointerSize+1-rcross.YData,rcross.XData)=1;
            case '2'
                pointer(pointerSize+1-rcross.YData,rcross.XData)=2;
            case 'n'
                pointer(pointerSize+1-rcross.YData,rcross.XData)=nan;
            case 's'
                timestr=char(datetime('now'));
                timestr(timestr==' ')='_';
                timestr(timestr==':')='_';
                nowStr=timestr;
                save([nowStr,'.mat'],'pointer','-mat');
        end
        [brow,bcol]=find(pointer==1);
        bshandle.XData=bcol;
        bshandle.YData=pointerSize+1-brow;

        [grow,gcol]=find(pointer==2);
        gshandle.XData=gcol;
        gshandle.YData=pointerSize+1-grow;

        rcross.XData=mod(rcross.XData+pointerSize-1,pointerSize)+1;
        rcross.YData=mod(rcross.YData+pointerSize-1,pointerSize)+1;
    end
end

mat文件的调用

p=load('heart.mat');
set(gcf,'Pointer','Custom','PointerShapeCData',p.pointer,'PointerShapeHotSpot',[16,16]); 

PNG图片转换为光标矩阵

我们只要将图片二值化,将图片和图片透明度表大小都调为32x32或者16x16,然后白色部分设置成2,黑色部分设置成1,透明度矩阵0值处设置为nan即可,代码如下:

[img,~,alpha]=imread('1.png');
pointerSize=32;

img=imresize(img,[pointerSize,pointerSize]);
if size(img,3)>1
    img=rgb2gray(img);
end
pointer=imbinarize(img)+1;
alpha=imresize(alpha,[pointerSize,pointerSize]);
pointer(alpha==0)=nan;

为了更方便设置光标,我将此部分封装为了一个函数,只要输入图片或者上一部分创建mat文件的路径、鼠标作用点位置,即可更改当前figure窗口的光标:

function setPointer(path,HotSpot,pointerSize)
%path: png图片,mat文件位置,或32x32,16x16double数组
%HotSpot:光标作用点
%pointerSize光标大小,仅path为png图片路径时需要设置
if nargin<3
    pointerSize=32;
end
if size(path,1)==1
    type=path(end-2:end);
    if strcmp(type,'mat')
        data=load(path);
        P=data.pointer; 
    else
        [img,~,alpha]=imread(path);
        
        img=imresize(img,[pointerSize,pointerSize]);
        if size(img,3)>1
            img=rgb2gray(img);
        end
        pointer=imbinarize(img)+1;
        alpha=imresize(alpha,[pointerSize,pointerSize]);
        pointer(alpha==0)=nan;
        P=pointer;
    end
else
    P=path;
end
set(gcf,'Pointer','Custom','PointerShapeCData',P,'PointerShapeHotSpot',HotSpot);
end
  • path:png图片,mat文件位置,或32x32,16x16double数组
  • HotSpot:光标作用点
  • pointerSize光标大小:仅path为png图片路径时需要设置

程序调用: 对于以下名为test.png的文件

以及自己画的一个ban.mat文件,可以通过以下方式调用:

setPointer('test.png',[15,15])
setPointer('ban.mat',[15,15])

可以看出图片转换的还是比较粗糙一点,有能力还是建议自己画。

以上就是Matlab实现鼠标光标变成爱心和瞄准镜形状的详细内容,更多关于Matlab鼠标光标的资料请关注我们其它相关文章!

(0)

相关推荐

  • 基于Matlab制作一个不良图片检测系统

    目录 不良图片检测部分 part.0 图片导入 part.1 检查是否为肤色 part.2 皮肤区域标记 part.3 通过皮肤区域特点判定是否为不良图片 完整代码 批量处理部分 不良图片检测部分 看到博主码猴小明用python PIL库制作了一个不良图片识别系统,手痒,想用MATLAB也试试,毕竟矩阵运算也算是MATLAB的强项了,使用MATLAB写可比用python写简洁太多了,总体流程如下: 检查各个像素是否为肤色 将相邻的肤色像素归为一个皮肤区域,得到若干个皮肤区域,并剔除像素数量极少的

  • 基于Matlab制作伪3D第一视角迷宫小游戏

    目录 游戏效果 游戏原理说明 第一代程序计算交点方法 第二代程序计算交点方法 距离转换为线段长度 完整代码 游戏效果 使用键盘上方向键↑向前移动 使用键盘左右方向键调整← →朝向 游戏原理说明 原理很简单,如效果图所示,主要就是以角色视角方向发射大量的直线模拟视线,并计算直线与墙壁交点,获取每一条视线方向下,角色到墙壁的距离,然后根据近大远小的原理绘制不同长度的竖向直线模拟墙壁. 第一代程序计算交点方法 第一代程序是使用的polyshape对象(二维多边形对象)制作墙壁,polyshape对象重

  • 使用Matlab绘制七夕咕呱小青蛙

    目录 基础代码 动图生成代码 咕呱,咕呱,咕呱 咕呱,咕呱,咕呱 咕呱,咕呱,咕呱 七夕节到了还不快给你的朋友安排上这只咕呱小青蛙? 基础代码 function gugua ax=gca; ax.DataAspectRatio=[1 1 1]; ax.XLim=[-5 5]; ax.YLim=[-5 5]; ax.XColor='none'; ax.YColor='none'; ax.Color=[115,173,194]./255; hold on % hold(ax,'on') % ====

  • 基于Matlab实现抖音小游戏苹果蛇

    最近抖音上苹果蛇小游戏大火,为了证明MATLAB无所不能,咋能不跟风做一个?于是就有了这一篇. 还是提一句这个小游戏开始玩的心路历程: 第1-5关:?这不就是有重力的贪吃蛇,有任何难度嘛?? 第6关:嗯...这个小技巧还是有点意思的 第30关:???这绕来绕去的是人出的题目?? 第90关:… …疯了疯了已经疯了 废话不多说看一下MATLAB版的完整代码: 为了方便修改,关卡地图就摆在m文件里,总共写了八关,但是只有代码没有素材包还是运行不了,因此请从文末获取完整压缩包. function app

  • 详解Matlab实现动态表白图的绘制

    目录 1.幸福和快乐的哲学追问 2.提前祝女朋友节日快乐 2.1 展现 2.2 代码 1.幸福和快乐的哲学追问 在过去的500年间,我们见证了一连串令人惊叹的革命.地球在生态和历史上都已经整合成一个单一的领域.经济呈现指数增长,今日人类所享有的财富在过去只有可能出现在童话里.而科学和工业革命也带给我们超人类的力量,以及几乎可以说无限的能源.不仅社会秩序完全改变,政治.日常生活和人类心理也彻底改观. 只不过,我们真的更快乐了吗?人类在过去5世纪间积蓄的财富,是不是真的让我们找到了新的满足感?有了取

  • Matlab绘制雨云图的方法详解

    目录 介绍 横向雨云图 纵向雨云图 介绍 写了俩代码模板,用来绘制横向云雨图与纵向云雨图,云雨图其实就是用把小提琴图拆开来的模板,想获取小提琴图绘制函数的可以看这里:基于Matlab绘制小提琴图的示例代码 后面的俩模板用的时候只需要换换数据,颜色及每一类名称即可,雨云图绘制效果如下: 横向雨云图 function rainCloudsTMPL1 % @author: slandarer % 在这里放入你的数据============================================

  • Matlab几个常用的绘图颜色搭配推荐

    目录 前言 1.Matlab标准颜色 2.Microsoft配色 3.自定义配色1 4.自定义配色2 5.自定义配色3 补充:matlab调色板 总结 前言 matlab绘图时,经常使用的颜色对比明显,易于区分,但有时美观性欠佳,各颜色之间略显突兀,下面就精不就多,推荐几款常用的离散色系搭配. 下面以箱线图为例,列举上述几种配色下的实际效果: 1.Matlab标准颜色 fillcolor1=[0.85, 0.33, 0.10].fillcolor2=[0.93, 0.69, 0.13].fill

  • Matlab实现鼠标光标变成爱心和瞄准镜形状

    目录 原理解释 PointerShapeCData PointerShapeHotSpot 创建mat文件并调用 该程序的代码 mat文件的调用 PNG图片转换为光标矩阵 宝~你快看,我连鼠标光标都是爱你的形状: 不爱的话就变成狙击镜的形状!! 我买了个小风车: 那么这些各种各样的形状的鼠标光标是咋设置的嘞? 原理解释 众所周知MATLAB中的光标形状可以通过如下的方式自定义: set(gcf,'Pointer','cross') 但能定义的种类非常有限,只有这么几种:‘arrow’ | ‘ib

  • matplotlib自定义鼠标光标坐标格式的实现

    matplotlib默认在图像Windows窗口中显示当前鼠标光标所在位置的坐标,格式为x=xx, y=xx. 鼠标光标的坐标格式由子图模块Axes中的format_coord函数控制. 通过重写format_coord函数即可实现坐标的自定义格式. 注意:调用format_coord函数的对象是子图对象,常见的错误主要在没有正确的获取当前子图对象. format_coord函数源码 matplotlib.axes.Axes.format_coord def format_coord(self,

  • matplotlib绘制多子图共享鼠标光标的方法示例

    matplotlib官方除了提供了鼠标十字光标的示例,还提供了同一图像内多子图共享光标的示例,其功能主要由widgets模块中的MultiCursor类提供支持. MultiCursor类与Cursor类参数类似,差异主要在: Cursor类参数只有一个ax,即需要显示光标的子图:MultiCursor类参数为canvas和axes,其中axes为需要共享光标的子图列表. Cursor类中,光标默认是十字线:MultiCursor类中,光标默认为竖线. 官方示例 import numpy as

  • 原生JS实现鼠标滑动撒爱心特效

    本文实例为大家分享了一个鼠标滑动撒爱心的js特效,效果如下: 以下是代码实现,欢迎大家复制粘贴和收藏. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

  • C#对桌面应用程序自定义鼠标光标

    有的时候,一个自定义的鼠标光标能给你的程序增色不少.本文这里介绍一下如何在.net桌面程序中自定义鼠标光标.由于.net的桌面程序分为WinForm和WPF两种,这里分别介绍一下. WinForm程序 对于WinForm程序,可以通过修改Control.Cursor属性来实现光标的修改,如果我们有光标文件的话,可以直接通过如下代码实现自定义光标: this.Cursor = new Cursor("myCursor.cur"); 但这种方式不是本文介绍的重点,本文主要介绍如何自己绘制光

  • 用javascript获取当页面上鼠标光标位置和触发事件的对象的代码

    用javascript获取鼠标位置: 复制代码 代码如下: function mousePosition(ev) { if (ev.pageX || ev.pageY) { return { x: ev.pageX, y: ev.pageY }; } return { x: ev.clientX + document.body.scrollLeft - document.body.clientLeft, y: ev.clientY + document.body.scrollTop - docu

  • 破除网页鼠标右键被禁用的绝招大全

    1. 在网页上任意处将右键按下,等跳出对话框时不要放开右键,将鼠标移至对话框,用鼠标左键点"确定",在将鼠标移动到想要的连接处,放开右键. 2. 同"1",只是将鼠标移至对话框,用回车去"确认". 3. 用组合键"CTRL+F10". 4. 在页面中点击右键,当出现警告窗口时,左手按键盘上的"CTRL+F4"键关闭提示窗口(以上的方法适用于仅禁用而没有隐藏右键菜单的网页). 5. 先用鼠标左键进入该页,记录

  • javascript 事件处理、鼠标拖动效果实现方法详解

    先看看要拖动的层(模拟窗口)的效果图吧. 要实现的拖动效果:鼠标左键在窗口上方的标题栏上按下,同时移动鼠标,窗口跟着移动.窗口: 复制代码 代码如下: <div id="win"> <div id="win_header"></div> </div> 一点准备工作: 要让窗口能自由移动,那么窗口的定位(position)应该采用绝对定位(absolute): 给窗口添加标题栏,这里使用一个放在窗口顶部的层实现,同时将标

  • js实现获取鼠标当前的位置

    有时候,我们需要得到窗口拖动或者鼠标移动的距离,此时可以通过计算鼠标前后在页面中的位置来得到想要的结果,下面介绍几个事件属性: 1.客户区坐标位置 鼠标事件都是在浏览器视口中的特定位置上发生的.这个位置信息保存在事件对象的 clientX 和 clientY 属性中.它们的值表示事件发生时鼠标指针在视口中的水平和垂直坐标(不包括页面滚动的距离).如下图所示: var div = document.getElementById("myDiv"); //获取元素 EventUtil.on(

  • jQuery鼠标事件汇总

    鼠标事件是在用户移动鼠标光标或者使用任意鼠标键点击时触发的. 1.click事件:点击鼠标左键时触发 $('p').click(function(){}); 示例: $('p').click(function(){ alert('click function is running !'); }); 2.dbclick事件:迅速连续的两次点击时触发 $('p').dbclick(function(){}); 示例: $("button").dblclick(function(){ $(&

随机推荐