让我们假设以下简单示例:
f = figure;
plot(-10:10, (-10:10).^3, '*-r');
x = 1;
y = 1;
set(f, 'ResizeFcn', {@resizeCallback2, x, y});
while 1
[x, y, button] = ginput(1);
if(button ~= 1)
break;
end
set(f, 'ResizeFcn', {@resizeCallback2, x, y});
end
%%--------------------------
function resizeCallback2(hFig, ~, foo, bar)
foo
bar
end
有没有更简单的方法来始终将 x 和 y 的实际*值传递给回调函数,而不必总是在循环中更新它? 谢谢!
最佳答案
看起来您正在尝试存储鼠标单击位置的值,然后将这些值用作调整大小函数(稍后将调用)的一部分。我会做出一些改变。
首先,使用另一个回调来捕获鼠标单击,而不是使用 while
循环。例如,您可以使用图 ButtonDownFcn
回调来触发一个函数,该函数旨在将鼠标位置捕获到某个位置。
其次,有更好的方法来存储鼠标位置,正确的方法取决于您的技能水平和程序的需求。其中一些存储数据的方法是:
在另一个回调的参数中,就像您现在所做的那样。这非常痛苦,但可能有效。因此,如果它足以满足您的需求,您可以保留它。
大多数 Matlab 对象中的“userdata”字段。有几个人提出了这个,并且效果很好。我不喜欢依赖这个,因为我总是担心其他一些工具也想使用 userdata 字段,并且这些工具会覆盖数据。
全局
变量值。我也不喜欢使用全局变量,出于同样的原因我不喜欢使用userdata
字段。但无论如何,全局变量有时是最好的解决方案。如果您一次只有一个图形,这可能是最简单、最省力的解决方案。 (多个数字将促使您选择userdata
解决方案作为最简单的解决方案。)提供一个
handle
类来存储一些数据(即 x 和 y),并将该类的副本提供给两个回调(ButtonDownFcn
和ResizeFcn
)。这允许两个函数传递数据,而不会污染其他任何人的 namespace 。这是我最喜欢的此类问题的解决方案,因此我将在下面对其进行更详细的描述。
要执行上面的选项 (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
关于matlab - 将实际值传递给 Matlab 中的回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8531286/