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
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?
回答(1 个)
Ayush Kumar Jaiswal
2022-6-26
编辑: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','')
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Graphics Object Programming 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!