在matlab中绘制2对可调整大小的矩形

时间:2014-09-17 12:28:49

标签: matlab rectangles

我有一个程序应该在matlab中绘制2个可调整大小的矩形。绘制两个可调整大小是好的,但我想在同一时间改变大小,我的意思是当我改变第一个的大小时,第二个大小也会改变。但我不知道如何将它们连接在一起。有谁能够帮我?! 谢谢。 这是我的代码:

figure,imshow('image.jpg');
h1 = imrect(gca, [10 10 300 500]);
h2 = imrect(gca, [200 200 400 300]);

2 个答案:

答案 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:

enter image description here

2:

enter image description here

希望有所帮助!如上所述,我使用h1作为全局变量来轻松地在函数之间传递数据,但是您可以使用更强大的替代方法。