在 Matlab 中,如何以编程方式将数据提示添加到具有已知顶点索引的 trisurf 对象?

In Matlab, how to programmatically add datatip to trisurf objects with known vertices index?

Trisurf(f,x,y,z) 函数可以绘制一个面片对象。如何使用代码在已知顶点索引处向此对象添加数据提示?

我在 2017b 尝试使用以下代码

cursorMode = datacursormode(gcf);
hdtip = cursorMode.createDatatip(h_surf); %h_surf is the handle of trisurf
hdtip.Cursor.Position=pos; %this commond seems cannot find the exact vertex and depends on the view angle, where pos is the vertex coordinates.
hdtip.Cursor.DataIndex=idx; %try to use this command to assign the vertex index, but not successful.DataIndex seems not the vertex index.

我将使用 docs 中的 trisurf 示例来创建网格:

[x,y] = meshgrid(1:15,1:15);
tri = delaunay(x,y);
z = peaks(15);
h_surf = trisurf(tri,x,y,z);

现在 tri 矩阵包含网格中每个顶点的 xyz 内的索引。我们可以选择一个顶点索引 idx,并从每个 x/y/z 数组中选择相应的值作为数据游标的 .Position 属性。与您的评论相反,Position 属性 不依赖于视角,它是相对于轴的位置(因此是您的数据)。

所以

idx = 123; % intex within triangulation "tri"
xcurs = x(tri(idx)); % = 5 in this example
ycurs = y(tri(idx)); % = 6 in this example
zcurs = z(tri(idx)); % = 0.65233 in this example
cursorMode = datacursormode(gcf);
hdtip = cursorMode.createDatatip(h_surf); 
hdtip.Cursor.Position = [xcurs,ycurs,zcurs];

您可以根据需要确定 idx,然后使用通用 idx 提取对齐的 xyz 坐标。

显示数据提示的两个不同视图:

此示例 运行 使用 MATLAB R2017b。

根据@Woffie的建议,我稍微调整了一下,重现了2017b和2019b不同视角下的错误。

首先启用view([180,0]);行。 运行 得到正确结果的代码。然后不关闭图形,注释这一行,只保留view([0,0]);得到错误的结果。但是如果在脚本前面加上Close all,应该每次都能得到正确的结果。 (但还是不知道是什么原因,是不是bug以及如何巧妙的避免。)

可能需要注意的是,在 2D 绘图中,这通常不是问题,因为通常不会更改视图。

ngrid=1000;%actualy doesnot matter.
x=linspace(-3,3,ngrid+1);
y=linspace(-3,3,ngrid+1);
[x,y] = meshgrid(x,y);
tri = delaunay(x,y);
z = peaks(x,y);
x=(x+3)/6;y=(y+3)/6;
h_surf = trisurf(tri,x,y,z,'EdgeAlpha',0.1);
x0=0.25;y0=0.44;%the above normlization are not necessary but easier to setup the query node.
z0=z(round(y0*ngrid)+1,round(x0*ngrid)+1);
pos=[x0,y0,z0];
view([0,0]);
view([180,0]); %toggle between these two view angles to see the difference.
cursorMode = datacursormode(gcf);
hdtip = cursorMode.createDatatip(h_surf); 
hdtip.Cursor.Position = pos;
hdtip.Cursor.Position

顺便说一句,我也想出了如何使用hdtip.Cursor.DataIndex=idx。基本上,这里的 DataIndexh_surf.XData(or YData or ZData) 线性 索引,而 XData, YData, ZDatamxn 矩阵,因为 node/vertex h_surf中所有面的坐标,其中m是每个面的节点数,n是面数。因此将节点索引转换为 DataIndex.

会很简单