这似乎是一个普遍的问题,但我正在努力使其具体化。
我正在编写一个MATLAB GUI,利用鼠标事件。
刷新功能是这样的,并将其切换到click
事件:
function callback(obj, event)
scatter(vx, vy, 'ro');
end
当然,点击几下后,这个数字就会变得一团糟。刷新期间,我必须删除以前的图形。
====主.m
global f
f = line(0,0);
====回调.m
function callback(obj, event)
global f
delete f
f = scatter(vx, vy, 'ro');
end
======
这段代码可以工作,但在我使程序变得更加复杂之后,它变得很难看。事实上,这个程序的真实版本是这样的:
f.r = line(0,0);
f.l = line(0,0);
f.P.l = line(0,0);
f.P.t = line(0,0);
...
所以我想知道如何在MATLAB GUI中编写刷新函数,优雅地删除以前的图形?
使用更结构化的方式来组织数据。类似这样的东西:
% main.m
function myMain
f = [
line(0,0); % right
line(0,0); % left
line(0,0); % P.right
line(0,0); % P.left
];
set(gca, 'UserData', f);
% ...etc.
end
% callback.m
function callback(obj, event)
f = get(gca, 'UserData');
delete(f(ishandle(f)));
f = scatter(vx, vy, 'ro');
set(gca, 'UserData', f);
% ...etc.
end
(这只是一种选择;当然还有很多方法可以满足你的要求(。
CCD_ 2可以被CCD_。您也可以传递f
,或者使callback
嵌套的in
主. Point is,
全局``可以很容易地避免,因为它通常会促进糟糕和有风险的风格。
如果你坚持命名地块,你也可以使用结构:
% ...
f.r = line(0,0); f.P.l = line(0,0);
f.l = line(0,0); f.P.t = line(0,0);
% ...
在这种情况下,您可以使用动态结构引用来删除您的绘图:
function callback(obj,event, f)
% ...
delete_all_plots(f);
function delete_all_fields(f)
fn = fieldnames(f);
for ii = 1:numel(fn)
field = f.(fn{ii});
if isstruct(field )
delete_all_fields(field);
else
if ishandle(field )
delete(field )
end
end
end
end
end
但正如你所看到的,与简单的平面阵列相比,这是不必要的复杂,所以我不会选择这个选项。