看起来您正在尝试存储鼠标单击位置的值,然后将这些值用作调整大小函数的一部分(稍后将调用该函数)。我会做出一些改变。
首先,使用另一个回调来捕获鼠标点击,而不是 while 循环。例如,您可以使用图形ButtonDownFcn 回调来触发旨在将鼠标位置捕获到某个位置的函数。
其次,有更好的方法来存储鼠标位置,正确的方法取决于你的技能水平和程序的需要。其中一些存储数据的方法是:
在另一个回调的参数中,就像你现在正在做的那样。这很痛苦,但它可能有效。因此,如果它足以满足您的需求,您可以保留它。
大多数 Matlab 对象中的“用户数据”字段。有几个人提出了这个问题,它会很好用。我不喜欢依赖这个,因为我总是害怕其他一些工具也想使用 userdata 字段,而这些工具会覆盖数据。
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