繁体   English   中英

使用Matlab在贴片表面显示3D数据

[英]Showing 3D data on a patch surface with Matlab

我想用Matlab显示物体表面的温度分布。

我有(x,y,z,V)向量形式的3D数据。 我想在Matlab中显示该对象,其颜色代表本地总的“值”。

我可以将对象导出为STL文件。 使用STL绘图可以很容易地显示它(请参阅stldemo ):

fv = stlread('file.stl');
patch(fv, 'EdgeColor', 'none', 'FaceLighting', 'gouraud', 'AmbientStrength', 0.15, 'FaceColor', [0.8 0.8 1.0]);
camlight('headlight');
material('dull');

要根据(x,y,z,V)为它着色,我需要将每个(x,y,z)点附加到面片中的一个顶点上(最接近的那个会起作用)。 如果有多个(x,y,z)点,其中单个STL顶点最近,那么我将为该顶点求和相应的V值。

顶点数为数千。 (x,y,z)点的数量也很大。 因此,毫无疑问,需要遍历(x,y,z)点,然后在顶点上进行内部循环以找到最接近的点(这涉及到计算点之间的距离)。 有什么聪明的方法可以快速地做到这一点?

注意:我无法控制数据点的位置,它们是由外部程序定义的。 STL点由另一个外部程序控制。 所以我必须嫁给两个不同的观点集。

这是说明我要实现的代码,具有4个顶点和3个数据点:

% Create patch
figure;
p = patch;
colorbar

p.Vertices = [...
    0, 0, 0; ...
    1, 0, 0; ...
    1, 1, 0;
    0, 1, 0];
p.Faces = [ ...
    1, 2, 3; ...
    1, 3, 4];

% Data points
x = [0.1, 0.1, 0.25];
y = [0.01, 0.02, 0.75];
z = [0.01, 0.2, -0.01];
v = [1, 1, 1];

p.FaceVertexCData = zeros(size(p.Vertices, 1), 1);
% Point 1 (0.1, 0.01, 0.01) is closest to vertex 1 (0, 0, 0). Its value
% goes to vertex 1.
p.FaceVertexCData(1) = p.FaceVertexCData(1) + v(1);
% Point 2 (0.1, 0.02, 0.2) is also closest to vertex 1 (0, 0, 0). Its
% value also goes to vertex 1
p.FaceVertexCData(1) = p.FaceVertexCData(1) + v(2);
% Point 3 (0.25, 0.75, -0.01) is closest to vertex 4 (0, 1, 0). Its power
% goes to vertex 4.
p.FaceVertexCData(4) = p.FaceVertexCData(4) + v(3);
% Other vertices are left with 0.

p.FaceColor = 'interp';

将点的体积标量值(在您的情况下为Temperature)附加到相邻点是一项棘手的练习,需要复杂的for循环并定义特殊情况规则(在您的情况下,您希望将2个不同的点的值附加到同一点补丁顶点,如果要附加的两个值不同怎么办?您平均吗?丢弃?)。

一种更安全的方法是在物体表面上重新插入温度场。 函数griddata可以为您完成此任务。

首先,我必须定义一个标量字段。 由于我没有温度数据,因此使用Matlab的flow函数。 我生成了与本文相同的标量字段: 流数据
这给了我每个坐标x, y, z的标量场v (流量值,但可以说是你的温度)。

流

然后,我创建并介绍了一个3D补丁,它将成为您的对象。 我选择了一个球体,但是任何3D补丁都将以相同的方式工作。 surf2patch借来获取作为补丁的球体的代码
您将必须对球体进行偏移和膨胀才能使其完全如下图所示

简单领域

现在是有趣的一点。 在以下代码中, v是在坐标x, y, z处的标量场(对您而言的温度)的x, y, z

%% // Extract patch vertices coordinates in separate variables
xp = fv.vertices(:,1) ;
yp = fv.vertices(:,2) ;
zp = fv.vertices(:,3) ;

%% // interpolate the temperature field over the patch coordinates
Tpv = griddata(x,y,z,v,xp,yp,zp) ;

%% // Set the patch color data to the new interpolated temperature
set(hp,'FaceVertexCData',Tpv) ;

现在,您的对象表面处于正确的插值温度:
如果您想单独观察面片,则可以删除切片平面

最终的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM