MATLAB-3D曲面图

MATLAB-3D曲面图,matlab,plot,3d,surface,Matlab,Plot,3d,Surface,我在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

我在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)。节点编号遵循标准程序:

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


您基本上希望将数据转换为网格对象。x、y、z坐标构成
顶点
或点,您可以通过连接
顶点
来定义
,然后可以将单个点或
顶点
设置为具有特定颜色值(在您的情况下为应力值)。要使用
顶点
绘制网格,可以使用
面片
方法

这里最难的部分是你有顶点,但没有面。一种快速尝试的方法是
convhull
,它返回一组点的凸包(考虑收缩包装点以生成曲面)

因此,首先:

patch('Vertices',[x y z],'Faces',convhull(x,y,z),'FaceVertexCData',sigma,'FaceColor','interp');
看看这是怎么回事,如果它不是你想要的,那么你可以改变
面。在上面的代码行中,
faces=convhull(x,y,z)
。您可能已经知道哪些顶点构成了面,例如,面1可以是点2、14和9-
面(1,:)=[2,14,9]

此外,如果希望面由四个点而不是三角形组成,则面数组将只是N-x-4而不是N-x-3

您给出的代码和上面的
补丁
代码的快速示例结果:


您基本上希望将数据转换为网格对象。x、y、z坐标构成
顶点
或点,您可以通过连接
顶点
来定义
,然后可以将单个点或
顶点
设置为具有特定颜色值(在您的情况下为应力值)。要使用
顶点
绘制网格,可以使用
面片
方法

这里最难的部分是你有顶点,但没有面。一种快速尝试的方法是
convhull
,它返回一组点的凸包(考虑收缩包装点以生成曲面)

因此,首先:

patch('Vertices',[x y z],'Faces',convhull(x,y,z),'FaceVertexCData',sigma,'FaceColor','interp');
看看这是怎么回事,如果它不是你想要的,那么你可以改变
面。在上面的代码行中,
faces=convhull(x,y,z)
。您可能已经知道哪些顶点构成了面,例如,面1可以是点2、14和9-
面(1,:)=[2,14,9]

此外,如果希望面由四个点而不是三角形组成,则面数组将只是N-x-4而不是N-x-3

您给出的代码和上面的
补丁
代码的快速示例结果:


这里是构建补丁的另一种方法。指定一个结构,其中包括点(顶点),然后是面(包括哪些点),然后是颜色向量(您的
sigma
值),然后将批次发送给面片函数,该函数将处理其余部分

然后确定细节(透明度、边缘颜色、打印点和文本等)

将产生:

编辑: 它比要求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 ] ;
定义面有多种方法,请注意,
向量的每一行都是定义区域的连续点(面将自行关闭,无需重复最后的第一个点来关闭曲面)。
我们从8分的脸到5分的脸。。。如果你想玩/完善你的模型,你可以尝试使用3个点面,它的工作原理是一样的。

这里是另一种构建补丁的方法。指定一个结构,其中包括点(顶点),然后是面(包括哪些点),然后是颜色向量(您的
sigma
值),然后将批次发送给面片函数,该函数将处理其余部分

然后确定细节(透明度、边缘颜色、打印点和文本等)

将产生:

编辑: 它比要求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 ] ;
定义面有多种方法,请注意,
向量的每一行都是定义区域的连续点(面将自行关闭,无需重复最后的第一个点来关闭曲面)。
我们从8分的脸到5分的脸。。。如果你想玩/完善你的模型,你可以尝试使用3个点面,同样的方法。

@Hoki谢谢你的代码。这绝对是一个进步!我承认你的回答是正确的@维哈奇