Is it possible to program the mouse cursor selection box on figures in MATLAB?

13 次查看(过去 30 天)
Hello everyone,
I am basically trying to recreate the well-known property of mouse cursor selection boxes for a current MATLAB project.
When I plot a rectangle on a figure, I would like my program to be able to deform the rectangle exactly in the way those typical
selection boxes of the mouse are deformed, if I would click for example the bottom-right corner of the box with the mouse and
drag it on the figure plane.
For this, I have found a code with a similar function for lines and curves, it is found in this question:
And the fitting code for the problem is attached here as dragpoints.m .
Now, when I use the following input examples on the dragpoints-function:
x = [6 12 12 6 6];
y = [6 6 12 12 6];
dragpoints(x,y,0,20,0,20);
the plotted rectangle will not be deformed in the way a mouse cursor selection box would be when I move one corner with my mouse cursor.
So my question is: Is there a way I could change this code and make it deform rectangles like selection boxes?
Is there any way I can program this cursor selection box property in MATLAB in general?
Thanks in advance, I appreciate all your help!
  2 个评论
Image Analyst
Image Analyst 2022-6-26
Not sure I understand what you want, but have you tried using drawrectangle to drag out a box and then using the coordinates from it to set xlim and ylim?
Muris Spahovic
Muris Spahovic 2022-6-26
编辑:Muris Spahovic 2022-6-26
Oh, um no actually. I didn't know this function exists, I will definitely check it out though.
Thank you very much! :)

请先登录,再进行评论。

回答(1 个)

Ayush Kumar Jaiswal
编辑:Ayush Kumar Jaiswal 2022-6-26
I think here is what you need:
function dragpoints(xData,yData,xLower,xUpper,yLower,yUpper)
figure;
x = xData;
y = yData;
ax = axes('xlimmode','manual','ylimmode','manual');
ax.XLim = [xLower xUpper];
ax.YLim = [yLower yUpper];
%can change the marker size or marker type to make it more visible.
%Currently is set to small points at a size of 2 so is not very visible.
line(x,y,'marker','.','markersize',2,'hittest','on','buttondownfcn',@clickmarker)
function clickmarker(src,ev)
set(ancestor(src,'figure'),'windowbuttonmotionfcn',{@dragmarker,src})
set(ancestor(src,'figure'),'windowbuttonupfcn',@stopdragging)
function dragmarker(fig,ev,src)
%get current axes and coords
h1=gca;
coords=get(h1,'currentpoint');
%get all x and y data
x=h1.Children.XData;
y=h1.Children.YData;
%check which data point has the smallest distance to the dragged point
x_diff=abs(x-coords(1,1,1));
y_diff=abs(y-coords(1,2,1));
[value index]=min(x_diff+y_diff);
%create new x and y data and exchange coords for the dragged point
x_new=x;
y_new=y;
% Ensure that x and y moves in a coordinated manner
if (index == 1)
x_new(index)=coords(1,1,1);
x_new(end)=coords(1,1,1);
x_new(4) = coords(1,1,1);
y_new(index)=coords(1,2,1);
y_new(end)=coords(1,2,1);
y_new(2)=coords(1,2,1);
elseif index == 2
x_new(index)=coords(1,1,1);
x_new(3) = coords(1,1,1);
y_new(index)=coords(1,2,1);
y_new(1)=coords(1,2,1);
y_new(end)=coords(1,2,1);
elseif index == 3
x_new(index)=coords(1,1,1);
x_new(2) = coords(1,1,1);
y_new(index)=coords(1,2,1);
y_new(4)=coords(1,2,1);
elseif index == 4
x_new(index)=coords(1,1,1);
x_new(1) = coords(1,1,1);
x_new(end) = coords(1,1,1);
y_new(index)=coords(1,2,1);
y_new(3)=coords(1,2,1);
elseif index == 5
x_new(index)=coords(1,1,1);
x_new(1)=coords(1,1,1);
x_new(4) = coords(1,1,1);
y_new(index)=coords(1,2,1);
y_new(1)=coords(1,2,1);
y_new(2)=coords(1,2,1);
end
%update plot
set(src,'xdata',x_new,'ydata',y_new);
function stopdragging(fig,ev)
set(fig,'windowbuttonmotionfcn','')
set(fig,'windowbuttonupfcn','')
  1 个评论
Muris Spahovic
Muris Spahovic 2022-6-26
编辑:Muris Spahovic 2022-6-26
Just tested your function, it works very well, although the rectangle is sometimes a bit shifted when
it's deformed. But the function is definitely what I was looking for, this will definitely help me further
on my project!
Thank you very much Ayush Kumar!

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Graphics Object Programming 的更多信息

产品


版本

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by