加速创建任意对象

时间:2015-07-08 09:13:33

标签: matlab image-processing matlab-figure

我必须在轴上创建一些可拖动的点。然而,这似乎是一个非常缓慢的过程,在我的机器上花费了一秒多的时间,如下所示:

x = rand(100,1);
y = rand(100,1);

tic;
for i = 1:100
    h(i) = impoint(gca, x(i), y(i));
end
toc;

任何关于加速的想法都会受到高度赞赏。

这个想法只是为用户提供纠正先前由Matlab计算过的图中位置的可能性,这里以随机数为例。

1 个答案:

答案 0 :(得分:1)

您可以在while循环中使用ginput光标标记要编辑的所有点。然后只需点击轴外即可离开循环,移动积分并接受任何键。

f = figure(1);
scatter(x,y);
ax = gca;
i = 1;
 while 1
        [u,v] = ginput(1);
        if ~inpolygon(u,v,ax.XLim,ax.YLim); break; end;
        [~, ind] = min(hypot(x-u,y-v));
        h(i).handle = impoint(gca, x(ind), y(ind));
        h(i).index  = ind;
        i = i + 1;
 end

enter image description here

根据您更新图表的方式,您可以使用clf(清晰图)和cla(清晰轴)等功能获得一般加速,而不是始终打开新图this answer中解释的窗口可能很有用。

或者以下是对我在评论中的含义的粗略概念。它引发了各种错误,我现在没有时间调试它。但也许它有助于作为一个起点。

1)传统的数据绘图和激活datacursormode

x = rand(100,1);
y = rand(100,1);
xlim([0 1]); ylim([0 1])

f = figure(1)
scatter(x,y)

datacursormode on
dcm = datacursormode(f);
set(dcm,'DisplayStyle','datatip','Enable','on','UpdateFcn',@customUpdateFunction)

2)自定义更新功能评估所选数据提示并创建impoint

function txt = customUpdateFunction(empt,event_obj)

pos = get(event_obj,'Position');
ax = get(event_obj.Target,'parent');
sc = get(ax,'children');

x = sc.XData;
y = sc.YData;
mask = x == pos(1) & y == pos(2);
x(mask) = NaN;
y(mask) = NaN;
set(sc, 'XData', x, 'YData', y);
set(datacursormode(gcf),'Enable','off')

impoint(ax, pos(1),pos(2));
delete(findall(ax,'Type','hggroup','HandleVisibility','off'));

txt = {};

如果您只想移动一个点,它适用于。重新激活datacursormode并设置第二个点失败:

enter image description here

也许你可以找到错误。