[英]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)。 節點編號遵循標准過程:
我想繪制該元素的表面,如圖所示。 然后(如果可能),我希望根據節點的應力值對表面進行着色(顏色映射)。 最終結果應該是這樣的:
本質上,您希望將數據轉換為網格對象。 x,y,z坐標組成Vertices
或點,您可以通過Vertices
來定義Faces
,然后可以將單個點或Vertex
為具有特定的顏色值(在您的情況下為應力值)。 要繪制具有vertices
和faces
的網格,可以使用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
將產生:
編輯:這比讓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.