2014-09-17 2 views
2

У меня есть программа, которая должна нарисовать 2-х значный прямоугольник в матлабе. рисование двух изменяемых размеров в порядке, но я хочу изменить размер в одно и то же время, я имею в виду, когда я изменяю размер первого, второе изменение тоже. но я не знаю, как объединить их. Кто-нибудь может мне помочь?! спасибо. вот мой код:Нарисуйте две пары изменяемых размеров прямоугольников в matlab

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

Пожалуйста, введите ваш текущий код с двумя индивидуально изменяемыми размерами прямоугольниками в свой вопрос. Вероятно, ответ является лишь незначительной модификацией этого кода. – Daniel

+0

код добавлен, спасибо Даниэлю. – Negar

+0

whit mouse click and move ... что вы имеете в виду прохожий? – Negar

ответ

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 
+0

Большое спасибо Daniel :) – Negar

+0

Возможно ли иметь координаты в реальном времени?! по BluePos = wait (h1); У меня есть они, после двойного щелчка мыши. но если я изменил положение и изменил размер прямоугольника снова, BluePos не изменится :( – Negar

+0

@Negar всегда вызывает getPosition, когда вы его используете. Затем он обновляется. – Daniel

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 

Я не знаю, как размещать анимированные гифы в ответах, но вот 2 изображения, показывающие 1-ый прямоугольник и затем 2 прямоугольники после перемещения первого:

1:

enter image description here

2:

enter image description here

Надеюсь, что это поможет! Как отмечено, я использовал h1 как глобальную переменную, чтобы легко передавать данные между функциями, но есть более надежные альтернативы, которые вы можете использовать.

+0

Большое вам спасибо Benoit, но ответ Дэниела, то есть то, что я хочу. – Negar

+0

ОК уверенный нет проблем! –