gpt4 book ai didi

MATLAB:如何使用 ButtonDownFcn 存储点击的坐标

转载 作者:行者123 更新时间:2023-12-04 05:08:27 26 4
gpt4 key购买 nike

目标:在一个图中执行多次点击,包含一个用 imshow 显示的图像并保存“点击”点的坐标,以用于进一步的操作。

备注:我知道这些功能 getpts/ginput但我想在不使用它们的情况下执行此操作。这是否可以使用 ButtonDownFcn ? (见下面的代码)

function testClicks
img = ones(300); % image to display
h = imshow(img,'Parent',gca);
set(h,'ButtonDownFcn',{@ax_bdfcn});

function ax_bdfcn(varargin)
a = get(gca,'CurrentPoint');
x = a(1,1);
y = a(1,2);

在这个阶段变量 xy只有“活”在里面 ax_bdfcn .
我怎样才能让它们在 testClicks 中可用功能?这是否可以使用 ButtonDownFcn ?这是一个好方法吗?

非常感谢。

编辑 1:
谢谢谢的回答。但是我仍然无法完成我想要的。
function [xArray, yArray] = testClicks()
img = ones(300); % image to display
h = imshow(img,'Parent',gca);
x = [];
y = [];
xArray = [];
yArray = [];
stop = 0;
while stop == 0;
set(h,'ButtonDownFcn',{@ax_bdfcn});
xArray = [xArray x];
yArray = [yArray y];
if length(xArray)>15
stop = 1;
end
end

function ax_bdfcn(varargin)
a = get(gca, 'CurrentPoint');
assignin('caller', 'x', a(1,1) );
assignin('caller', 'y', a(1,2) );
end
end % must have end for nested functions

这段代码(错误!)是我能得到的最接近我想要的(在所有点击之后,有一个包含点击点的 x 和 y 坐标的数组)。我显然不了解执行此任务的机制。有什么帮助吗?

最佳答案

有几种方式

  • 使用 nested functions
    function testClicks
    img = ones(300); % image to display
    h = imshow(img,'Parent',gca);
    set(h,'ButtonDownFcn',{@ax_bdfcn});
    x = []; % define "scope" of x and y
    y = [];

    % call back as nested function
    function ax_bdfcn(varargin)
    a = get(gca,'CurrentPoint');
    x = a(1,1); % set x and y at caller scope due to "nested"ness of function
    y = a(1,2);
    end % close nested function
    end % must have end for nested functions
  • 使用 assignin
    function ax_bdfcn(varargin)
    a = get(gca, 'CurrentPoint');
    assignin('caller', 'x', a(1) );
    assignin('caller', 'y', a(2) );
  • 使用 'UserData'图形句柄的属性
    function ax_bdfcn(varargin)
    a = get(gca, 'CurrentPoint');
    set( gcf, 'UserData', a(1:2) );
    'UserData'可以使用 cp = get( gcf, 'UserData'); 访问(只要该图还活着) .

  • 编辑:
    将单击的位置“传达”到 'base' 的方法示例工作空间
    function ax_bdfcn(varargin)
    a = get(gca,'CurrentPoint');
    % the hard part - assign points to base
    if evalin('base', 'exist(''xArray'',''var'')')
    xArray = evalin('base','xArray');
    else
    xArray = [];
    end
    xArray = [xArray a(1)]; % add the point
    assignin('base','xArray',xArray); % save to base
    % do the same for yArray

    调用后 testClicks没有 xArrayyArray工作区中的变量(至少不应该)。在第一次点击后,这两个变量将“奇迹般地”被创建。每隔一次单击后,这两个数组将增加它们的大小,直到您关闭图形。

    关于MATLAB:如何使用 ButtonDownFcn 存储点击的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15202236/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com