繁体   English   中英

MATLAB-3D表面图

[英]MATLAB - 3D surface plot

我在3D空间中有20个数据点。 在这里您可以看到它们的绘制:

clear all
close all
clc

Data = [97.4993     104.3297    0.7500  196.7021
        100.0000    105.0000    0.7500  290.9164
        100.0000    107.5000    0.7500  142.1626
        96.2569     106.4992    0.7500  143.3605
        97.5028     104.3317    1.0000  197.1111
        100.0000    105.0000    1.0000  290.4210
        100.0000    107.5000    1.0000  144.0155
        96.2530     106.4969    1.0000  144.0969
        98.7055     104.8295    0.7500  239.7734
        100.0000    106.2500    0.7500  214.6557
        98.0627     107.2455    0.7500  145.4154
        96.8781     105.4144    0.7500  161.7000
        97.5010     104.3307    0.8750  196.8880
        100.0000    105.0000    0.8750  290.6686
        100.0000    107.5000    0.8750  141.5008
        96.2549     106.4980    0.8750  144.0253
        98.7075     104.8300    1.0000  239.3455
        100.0000    106.2500    1.0000  215.2104
        98.0605     107.2449    1.0000  144.9653
        96.8779     105.4143    1.0000  161.4253];

x = Data(:,1); % x coordinates 
y = Data(:,2); % y coordinates 
z = Data(:,3); % z coordinates 
sigma = Data(:,4); % stress value at that point

for ii = 1:length(x)

    plot3(x(ii,1),y(ii,1),z(ii,1),'r*')
    hold on
    grid on
    text(x(ii,1),y(ii,1),z(ii,1),['   ' num2str(ii) '   '...
        num2str(sigma(ii))],'HorizontalAlignment','left','FontSize',12); 

end

此数据表示一个HEX20元素(FEM)及其20个节点。 每个节点旁边都有其应力值(sigma)。 节点编号遵循标准过程:

HEX20元素

我想绘制该元素的表面,如图所示。 然后(如果可能),我希望根据节点的应力值对表面进行着色(颜色映射)。 最终结果应该是这样的:

在此处输入图片说明

本质上,您希望将数据转换为网格对象。 x,y,z坐标组成Vertices或点,您可以通过Vertices来定义Faces ,然后可以将单个点或Vertex为具有特定的颜色值(在您的情况下为应力值)。 要绘制具有verticesfaces的网格,可以使用patch方法。

这里的难点是您有顶点,但没有面孔。 一种快速尝试的方法是convhull ,它返回一组点的凸包(想想将这些点收缩包装以得到一个表面)。

因此开始:

patch('Vertices',[x y z],'Faces',convhull(x,y,z),'FaceVertexCData',sigma,'FaceColor','interp');

看看情况如何,如果不是您要找的东西,那么您可以改变faces 在上面的代码行中, faces = convhull(x,y,z) 您已经知道哪些顶点构成了您的脸部,例如Face1可以是Point 2、14和9- faces(1,:) = [2,14,9]

同样,如果您希望由四个点而不是三角形构成的人脸,则您的人脸数组将只是N乘4而不是N乘3。

您提供的代码和上面的patch代码的快速示例结果:

您提供的代码的快速示例

http://uk.mathworks.com/help/matlab/visualize/multifaceted-patches.html http://uk.mathworks.com/help/matlab/ref/convhull.html

这是构建补丁的另一种方法。 您可以先指定一个带有点(顶点)的结构,然后再指定面(它们包括哪些点),然后指定一个颜色矢量(您的sigma值),然后将批次发送给patch函数,其余部分将由该函数负责。

然后确定细节(透明度,边缘颜色,绘制点和文本等...)

fv.vertices = Data(:,1:3);
fv.faces = [...
    1  9 2 10 3 11 4 12 ;
    1  9 2 14 6 17 5 13 ;
    5 17 6 18 7 19 8 20 ;
    2 10 3 15 7 18 6 14 ;
    3 11 4 16 8 19 7 15 ;
    4 12 1 13 5 20 8 16 ...
    ] ;
fv.facevertexcdata = Data(:,4);

hold on
hp  = patch(fv,'CDataMapping','scaled','EdgeColor',[.7 .7 .7],'FaceColor','interp','FaceAlpha',1)    
hp3 = plot3(x,y,z,'ok','Markersize',6,'MarkerFaceColor','r')

for ii = 1:length(x)
    text(x(ii,1),y(ii,1),z(ii,1),{sprintf('   #%d - \\sigma:%4.1f',ii,sigma(ii))},...
        'HorizontalAlignment','left','FontSize',8,'FontWeight','bold'); 
end
view(-27,26)
axis equal
axis off
colorbar south

将产生:

m

编辑:这比让convhull查找信封要乏味,但是它具有尊重元素实际形状的优点(不关闭节点9和17附近的向内小体积)。


为了避免补丁面不是完美平面时的图形渲染毛刺,可以定义面以使它们都完全是平面。 这意味着要定义更多的面孔(我们必须将所有面孔分成2个),但这可以解决小故障,现在您的所有面孔都是可见的。 因此,如果要这样做,只需将上面的面部定义替换为:

fv.faces = [...
     1  9 11 4 12 ;
     9  2 10 3 11 ;
     1  9 17 5 13 ;
     9  2 14 6 17 ;
     2 10 18 6 14 ;
    10  3 15 7 18 ;
     3 11 19 7 15 ;
    11  4 16 8 19 ;
     4 12 20 8 16 ;
    12  1 13 5 20 ;
     5 17 19 8 20 ;
    17  6 18 7 19 ] ;

定义面孔的方法不止一种,只需注意, faces矢量的每一行都是定义一个区域的一系列点(面孔将自行关闭,无需重复最后的第一个点以封闭面孔)。表面)。 我们从拥有8个点的面孔变为拥有5个点的面孔...如果您想玩/优化模型,可以尝试使用3个点的面孔,其工作方式相同。

暂无
暂无

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

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