在 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
矩阵包含网格中每个顶点的 x
、y
和 z
内的索引。我们可以选择一个顶点索引 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
提取对齐的 x
、y
和 z
坐标。
显示数据提示的两个不同视图:
此示例 运行 使用 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
。基本上,这里的 DataIndex
是 h_surf.XData(or YData or ZData)
的 线性 索引,而 XData, YData, ZData
是 mxn
矩阵,因为 node/vertex h_surf
中所有面的坐标,其中m
是每个面的节点数,n
是面数。因此将节点索引转换为 DataIndex
.
会很简单
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
矩阵包含网格中每个顶点的 x
、y
和 z
内的索引。我们可以选择一个顶点索引 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
提取对齐的 x
、y
和 z
坐标。
显示数据提示的两个不同视图:
此示例 运行 使用 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
。基本上,这里的 DataIndex
是 h_surf.XData(or YData or ZData)
的 线性 索引,而 XData, YData, ZData
是 mxn
矩阵,因为 node/vertex h_surf
中所有面的坐标,其中m
是每个面的节点数,n
是面数。因此将节点索引转换为 DataIndex
.