gpt4 book ai didi

matlab - 在 3D 图形 Matlab 中获取点击点坐标

转载 作者:行者123 更新时间:2023-12-04 08:29:11 28 4
gpt4 key购买 nike

我在 Matlab 中有一个 3D 图形,假设它是球体。我需要的是获取 X , Y , Z表面上点的值,我用鼠标单击。

r = 10;
[X,Y,Z] = sphere(50);
X2 = X * r;
Y2 = Y * r;
Z2 = Z * r;
figure();
props.FaceColor = 'texture';
props.EdgeColor = 'none';
props.FaceLighting = 'phong';
sphere = surf(X2,Y2,Z2,props);
axis equal
hold on

clicked_point = [?,?,?];
enter image description here
所以在这个例子中我想要 clicked_point等于 [-3.445,-7.32,5.878] .
我试过这样的解决方案:
clear all;
close all;
r = 10;
[X,Y,Z] = sphere(50);
X2 = X * r;
Y2 = Y * r;
Z2 = Z * r;
fig = figure();
props.FaceColor = 'texture';
props.EdgeColor = 'none';
props.FaceLighting = 'phong';
sphere = surf(X2,Y2,Z2,props);
axis equal

dcm_obj = datacursormode(fig);
set(dcm_obj,'DisplayStyle','datatip',...
'SnapToDataVertex','off','Enable','on')
c_info = getCursorInfo(dcm_obj);

while length(c_info) < 1
datacursormode on
c_info = getCursorInfo(dcm_obj);
end
但在那之后,我什至无法点击球体来显示图上的任何数据。我怎样才能得到 X , Y , Z在脚本中?如果没有,我怎么能检测到鼠标点击已经在 Matlab 中发生了?

最佳答案

不清楚你是否想要clicked_point变量驻留在基础工作区中,或者如果这将成为 GUI 的一部分。
我会给你一个基础工作区的解决方案。
诀窍是将您需要的代码添加到 UpdateFcndatacursormode目的。
保存函数 getClickedPoint.m在您的 MATLAB 路径上可见的某处:

function output_txt = getClickedPoint(obj,event_obj)
% Display the position of the data cursor
% obj Currently not used (empty)
% event_obj Handle to event object
% output_txt Data cursor text string (string or cell array of strings).

pos = get(event_obj,'Position');
output_txt = {['X: ',num2str(pos(1),4)],...
['Y: ',num2str(pos(2),4)]};

% If there is a Z-coordinate in the position, display it as well
if length(pos) > 2
output_txt{end+1} = ['Z: ',num2str(pos(3),4)];
end

assignin('base','clicked_point',pos)
所有这些代码实际上是数据游标使用的默认函数的副本。唯一的修改是:
  • 我更改了名称(显然您希望它是唯一的)
  • 我添加了最后一行代码

  • 最后一行代码使用 assignin 将光标的位置转移到 clicked_point 中的一个变量(名为 base )中工作区。
    有了这个,保留生成球体的代码(尽管我建议您将表面对象的名称更改为 sphere 以外的名称,因为这是一个内置的 MATLAB 函数),我们只需要修改 datacursormode对象指示它使用我们的 getClickedPoint功能:
    [X,Y,Z] = sphere(50);
    r = 10 ; X2 = X * r; Y2 = Y * r; Z2 = Z * r;
    fig = figure ;
    hs = surf(X2,Y2,Z2,'FaceColor','texture','EdgeColor','none','FaceLighting','phong');
    axis equal

    %% Assign custom update function to dcm
    dcm_obj = datacursormode(fig);
    set(dcm_obj,'SnapToDataVertex','off','Enable','on','UpdateFcn',@getClickedPoint)

    现在第一次单击球体时,变量 clicked_point将在工作区中使用该点的坐标创建。每次您再次单击球体时,变量都会更新:
    enter image description here

    如果这要与 GUI 一起应用,请使用相同的技术,但不要使用 assignin ,我建议使用 setappdata 功能。 (您可以阅读 Share Data Among Callbacks 以了解有关其工作原理的详细信息。)

    关于matlab - 在 3D 图形 Matlab 中获取点击点坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65109922/

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