Похоже, вы пытаетесь сохранить значение позиции щелчка мыши, а затем использовать эти значения как часть функции изменения размера (которая будет вызвана позже).Я бы сделал несколько изменений:
Во-первых, вместо цикла while
используйте другой обратный вызов для захвата щелчка мыши.Например, вы можете использовать рисунок ButtonDownFcn
обратный вызов, чтобы вызвать функцию, которая была разработана для захвата положения мыши в каком-то месте.
Во-вторых, есть лучшие способы сохранить положение мыши, и правопуть будет зависеть от вашего уровня квалификации и потребностей вашей программы.Вот некоторые из этих методов хранения данных:
В аргументах для другого обратного вызова, как вы делаете сейчас.Это довольно больно, но, вероятно, работает.Таким образом, вы можете сохранить его, если он достаточно хорош для ваших нужд.
Поле 'userdata' в большинстве объектов Matlab.Несколько человек подняли этот вопрос, и он будет работать нормально.Мне не нравится полагаться на это, потому что я всегда боюсь, что какой-то другой инструмент также захочет использовать поле пользовательских данных, и эти инструменты будут перезаписывать данные.
A global
значение переменной.Я также не люблю использовать глобальные переменные, по той же причине, по которой я не люблю использовать поле userdata
.Но globals
иногда так или иначе являются лучшим решением.Это, вероятно, самое простое решение с минимальными усилиями, если у вас есть только одна фигура за раз.(Несколько цифр приведут вас к решению userdata
как к простейшему решению.)
Предоставьте класс handle
для хранения некоторых данных (т.е. x и y) и выдайте копиюэтого класса для каждого из двух обратных вызовов (ButtonDownFcn
и ResizeFcn
).Это позволяет двум функциям передавать данные, не загрязняя чужое пространство имен.Это мое любимое решение проблемы такого рода, поэтому я приведу более подробное описание ниже.
Для выполнения вышеуказанного варианта (4) потребуется класс дляхраните данные, которые выглядят примерно так:
classdef ApplicationData < handle
properties (SetAccess = public, GetAccess = public)
x = [];
y = [];
end
end
Обратите внимание, что поскольку ApplicationData
расширяет handle
, Matlab обрабатывает их как объект передачи по ссылке, что нам полезно.
Затем вы можете создать экземпляр этого класса и передать его каждой функции обратного вызова.
dataPassing = ApplicationData;
set(f, 'ButtonDownFcn', @(x,y) mouseClickCapture(x,y,dataPassing));
set(f, 'ResizeFcn', @(x,y) resizeCallback2(x,y, dataPassing));
Где mouseClickCapture
выглядит примерно так:
function mouseClickCapture(hAxis, ignored, dataPassingClass)
mousePositionData = get(hAxis,'CurrentPoint');
dataPassingClass.x = mousePositionData(1,1);
dataPassingClass.y = mousePositionData(1,2);
И вашresizeCallback2
выглядит примерно так:
function resizeCallback2(h, ignored, dataPassingClass)
%Do something here using
%dataPassingClass.x
%and
%dataPassingClass.y