我有一个程序应该在matlab中绘制2个可调整大小的矩形。绘制两个可调整大小是好的,但我想在同一时间改变大小,我的意思是当我改变第一个的大小时,第二个大小也会改变。但我不知道如何将它们连接在一起。有谁能够帮我?! 谢谢。 这是我的代码:
figure,imshow('image.jpg');
h1 = imrect(gca, [10 10 300 500]);
h2 = imrect(gca, [200 200 400 300]);
答案 0 :(得分:1)
要解决此问题,您必须使用addNewPositionCallback
。
编写您自己的函数,实现您需要的逻辑。此示例将所有矩形设置为相同的大小:
function myPositionFunction(allRects,changed,position)
%iterate over all rectangles
for idx=1:numel(allRects)
%skip the currently changed one
if idx~=changed
%get position, modify it and set it
thisP=allRects(idx).getPosition();
thisP(3:4)=position(3:4);
allRects(idx).setPosition(thisP);
end
end
end
现在是棘手的部分,如何使实际可用的回调:
figure
imshow('board.tif')
h1 = imrect(gca, [10 10 20 20]);
h2 = imrect(gca, [20 20 30 30]);
addNewPositionCallback(h1,@(p)myPositionFunction([h1,h2],1,p))
addNewPositionCallback(h2,@(p)myPositionFunction([h1,h2],2,p))
这样您的回调就会被调用:
-first parameter a list of all rectangles (could be extended to more than two)
-second parameter the index of the changed rectangle
-third parameter the new boundaries of the changed rectangle
答案 1 :(得分:0)
我看到@Daniel刚刚发布了一个答案,但这里也是使用addNewPositionCallback的替代解决方案。
1)首先创建一个绘制第一个矩形的函数,然后添加回调:
function Draw2Rect(~)
global h1
A = imread('peppers.png');
imshow(A);
h1 = imrect(gca,[20 20 200 150]);
addNewPositionCallback(h1,@UpdateRect)
2)然后定义回调调用的匿名函数,首先使用findobj来查找当前轴绘制的矩形。正确的对象属于' hggroup'。基本上你会查找所有存在的矩形,当你移动第一个矩形时,先删除它们并绘制一个新的矩形。在这里,我使用了位置之间的虚拟关系,但你明白了。
function UpdateRect(~)
global h1 % Simpler to use global variables but there are more robust alternatives!
Rect1Pos = getPosition(h1); % Get the position of your rectangle of interest
hRect = findobj(gca,'Type','hggroup'); % Find all rectangle objects
if numel(hRect>1) Once you start changing the first rectangle position, delete others.
delete(hRect(1:end-1))
h2 = imrect(gca,round(Rect1Pos/2));
end
我不知道如何在答案中发布GIF动画,但这里有2张图片显示第一个矩形,然后移动第一个矩形后的2个矩形:
1:
2:
希望有所帮助!如上所述,我使用h1作为全局变量来轻松地在函数之间传递数据,但是您可以使用更强大的替代方法。