Я вижу, что @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:
2:
Надеюсь, что это поможет! Как отмечено, я использовал h1 как глобальную переменную, чтобы легко передавать данные между функциями, но есть более надежные альтернативы, которые вы можете использовать.
Пожалуйста, введите ваш текущий код с двумя индивидуально изменяемыми размерами прямоугольниками в свой вопрос. Вероятно, ответ является лишь незначительной модификацией этого кода. – Daniel
код добавлен, спасибо Даниэлю. – Negar
whit mouse click and move ... что вы имеете в виду прохожий? – Negar