Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab中的交互式鼠标指针定位_Matlab_Mouse_Geometry_Interactive - Fatal编程技术网

matlab中的交互式鼠标指针定位

matlab中的交互式鼠标指针定位,matlab,mouse,geometry,interactive,Matlab,Mouse,Geometry,Interactive,朋友 我有一个问题,我正在写一个网络路由代码,特别是我想在matlab中实现Aodv协议,现在我想在我的代码中添加一些图形部分 假设在一张1000*1000的零图像上,我们有一些节点(路由器),它们由一个大小为15*15、颜色为白色的正方形显示,所以我们在零图像中有一些白色部分 现在我写了一个函数,用特定的半径在每个部分周围画一个圆,但是因为我们有很多节点,我们的图像会非常脏,所以我想让你帮我改变这个函数,当鼠标指针指向每个白色部分时,显示一个圆,当我们将鼠标指针移动到另一部分时,该圆将被隐藏。

朋友

我有一个问题,我正在写一个网络路由代码,特别是我想在matlab中实现Aodv协议,现在我想在我的代码中添加一些图形部分

假设在一张1000*1000的零图像上,我们有一些节点(路由器),它们由一个大小为15*15、颜色为白色的正方形显示,所以我们在零图像中有一些白色部分


现在我写了一个函数,用特定的半径在每个部分周围画一个圆,但是因为我们有很多节点,我们的图像会非常脏,所以我想让你帮我改变这个函数,当鼠标指针指向每个白色部分时,显示一个圆,当我们将鼠标指针移动到另一部分时,该圆将被隐藏。

这可以通过充分巧妙地使用图形的
WindowButtonMotionFcn
属性和轴的
CurrentPoint
属性来实现

给定一个具有黑色背景和一些白色区域的图像,此处通过随机设定5个中心点的种子,然后将它们扩展到所需大小来生成,您可以使用
WindowButtonMotionFcn
回调来测试光标是否在图像尺寸内1)和白点上2)。如果是,请在白色正方形上方的图像轴上绘制一个圆。对于任何输入图像都可以进行类似的工作,但如果图像是在函数中提供的而不是生成的,则可能需要进行一些预处理以确定区域的中心位置

代码:

功能电路指针
%在“地物”窗口中初始化地物和轴
图=图('Position'、[200 600]、'WindowButtonMotionFcn'、@MouseOverFcn);
ax=轴('父',图,'位置',[0.05 0.05.90.90]。。。
‘XLim’、[0.5 1000.5]、‘YLim’、[0.5 1000.5]);
%用随机的白色方块制作黑色图像
img=零(10001000);
whiteSquares=randperm(1000,10);
白色正方形=重塑(白色正方形,[],2);
对于k=1:大小(白色正方形,1);
img(whiteSquares(k,1),whiteSquares(k,2))=1;
终止
半方形尺寸=7;%待绘制正方形一侧的尺寸除以2
img=bwmorph(img,'扩张',半方形尺寸);
%在上面生成的轴中显示图像
imagesc(1:1000,1:1000,img,'父',ax);
集合(ax,'XTick',[],'YTick',[]);
彩色地图(“灰色”);
%使用MouseOverFcn确定光标当前指向的位置
%定位在图形窗口中。
%如果光标位于图像轴内且悬停在白色区域上
%正方形,然后在正方形周围画一个红色圆圈。如果其中一个或两个
%如果不满足这些条件,请清除所有先前绘制的
%圆圈。
函数MouseOverFcn(varargin)
PostNow=round(get(ax,'CurrentPoint'));
如果全部(PostNow(1,1:2)<1000)和全部(PostNow(1,1:2)>1)
if(img(PostNow(1,2),PostNow(1,1))==1)
%重叠圆
%查找当前悬停在哪个方块上
%光标
最近正方形=knnsearch(白色正方形,[PostNow(1,2)PostNow(1,1)]);
%画一个圆圈,圆圈以当前正方形为中心
集合(ax,'NextPlot','add');
circRad=30;%以图像轴为单位的圆半径
circCent=[whiteSquares(最接近的正方形,2),whiteSquares(最接近的正方形,1)];
circAngle=[0:2:(2*pi)0];
[circPtsX,circPtsY]=pol2cart(circAngle,circRad*one(1,长度(circAngle));
绘图(圆圈+圆圈(1),圆圈+圆圈(2),'r','Tag','drawnCircles');
设置(ax、“下一批”、“替换”);
其他的
%如果光标当前未位于
%如图所示,清除所有以前绘制的圆
删除(findobj('Tag','drawnCircles');
终止
其他的
%如果光标当前不在图像上,
%清除所有以前绘制的圆
删除(findobj('Tag','drawnCircles');
终止
终止
终止

您可以使用图形窗口。 请参阅并控制+F以查找单词“Callback”,这将显示可供使用的回调。 使用这些方法,您就可以编写一个应用程序来执行您所要求的操作

set(gcf, 'UserData', {some, data, my, callbacks, need});
set(gcf,'ButtonDownFcn',@myMouseBtnDownCallback);
set(gcf,'windowbuttonmotionfcn',@myMouseMoveCallback);
set(gcf,'windowbuttonupfcn',@myMouseBtnUpCallback);

function myMouseBtnDownCallback(src, eventdata)
function myMouseMoveCallback(src,eventdata,r)
function myMouseBtnUpCallback(src,evendata)

具体来说,我会像这样更改代码,但当我指向白色部分时,不会在该部分周围出现任何圆圈(我的图像是test 2,带有一些白色部分的零图像)

功能电路指针
图=图('WindowButtonMotionFcn',@MouseOverFcn);
ax=轴('父',图,'位置',[0.05 0.05.90.90]。。。
‘XLim’、[0.5 1000.5]、‘YLim’、[0.5 1000.5]);
img=imread('test2.jpg');
img=img(:,:,1);
img=im2double(img);
[r,c]=尺寸(img);
图像SC(1:r,1:c,img,'父',ax);
集合(ax,'XTick',[],'YTick',[]);
彩色地图(“灰色”);
函数MouseOverFcn(varargin)
PostNow=round(get(ax,'CurrentPoint'));
如果全部(PostNow(1,1)1)和全部(PostNow(1,2)
再次向大家问好,非常感谢您的帮助,但为什么当我使用imread函数读取img以读取创建的图像(零背景和一些小的白色正方形)时,此代码有错误“…这是
set(gcf, 'UserData', {some, data, my, callbacks, need});
set(gcf,'ButtonDownFcn',@myMouseBtnDownCallback);
set(gcf,'windowbuttonmotionfcn',@myMouseMoveCallback);
set(gcf,'windowbuttonupfcn',@myMouseBtnUpCallback);

function myMouseBtnDownCallback(src, eventdata)
function myMouseMoveCallback(src,eventdata,r)
function myMouseBtnUpCallback(src,evendata)
  function circlePointer
           fig = figure( 'WindowButtonMotionFcn', @MouseOverFcn);
           ax = axes('Parent', fig, 'Position', [0.05 0.05 .90 .90], ...
          'XLim', [0.5 1000.5], 'YLim', [0.5 1000.5]);
           img=imread('test2.jpg');
           img=img(:,:,1);
           img=im2double(img);
           [r,c]=size(img);
           imagesc(1:r, 1:c, img, 'Parent', ax);
           set(ax, 'XTick', [], 'YTick', []);
           colormap('gray');


function MouseOverFcn(varargin)

    PostNow = round(get(ax, 'CurrentPoint'));

    if all(PostNow(1, 1) < c) && all(PostNow(1, 1:2) > 1) && all(PostNow(1, 2) < r)
        if (img(PostNow(1,2), PostNow(1,1)) == 1)

        % this function (insert shape) put a circle arround  a pointed pixel        

        img=insertShape(img, 'circle', [PostNow(1, 1) PostNow(1, 1) 300],'Color',{'red'},'Opacity', .4);
        imshow(img)

        else
            % If cursor is not currently over a white square in the
            % image, clear all previously drawn circles
            delete(findobj('Tag', 'drawnCircles'));

        end

    else
        % If cursor is not currently over the image,
        % clear all previously drawn circles
        delete(findobj('Tag', 'drawnCircles'));
    end

end
end