簡體   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