2017-11-18 190 views
1

我想在由雙變量函數生成的表面下可視化3D體積。到目前爲止,我可以生成曲面,但我不知道如何實際可視化音量。可視化表面下的體積

funCube = @(x,y)2.6207.*(sin(x)+cos(x)).*cos(y); 
funCylinder = @(x, y) 3.078677852.*cos(y); 

cubePlot = ezsurf(funCube, [0, 0.26, 0, 0.26], 120); 
hold on; 
cylinderPlot = ezsurf(funCylinder, [0, 0.26, 0, 0.26], 120); 
+0

不確定這是不是你的意思,但有一種方法是,如果你有一個網格,並且你用'1'標記網格上的所有點'在'裏面''和'0'在外面,你然後可以創建一個等值面(默認的0.5值),這將給你一個3D補丁對象。 –

回答

1

這是一個使用填充多邊形(patch對象)的解決方案。我們的想法是,除了表面之外,我們還創建了5個多邊形來形成「4個牆壁和一個地板」,而表面本身就像一個「天花板」。

結果:

5-Patch approach

我想說它給卷的印象非常好。

function q47361071 
%% Definitions: 
% Define a surface equation: z = f(x,y) 
funCube = @(x,y)2.6207.*(sin(x)+cos(x)).*cos(y); 
% Evaluate the surface equation at a grid of points: 
X = 0:0.01:0.26; Y = X; 
[YY,XX] = meshgrid(X,Y); 
ZZ = funCube(XX,YY); 
%% Visualization: 
figure(); surf(XX,YY,ZZ); hAx = gca; hold(hAx,'on'); view([-50 35]); 
draw5Poly(hAx,XX,YY,ZZ); 
end 

function draw5Poly(hAx,XX,YY,ZZ) 
P = {[XX(1,1), YY(1,1), 0; [XX(:,1)  YY(:,1)  ZZ(:,1) ]; XX(end,1),YY(end,1), 0],... 
    [XX(1,end), YY(1,end),0; [XX(:,end) YY(:,end) ZZ(:,end) ]; XX(end,1),YY(end,end), 0],... 
    [XX(1,1), YY(1,1), 0; [XX(1,:).' YY(1,:).' ZZ(1,:).' ]; XX(1,end),YY(1,end), 0],... 
    [XX(end,1), YY(end,1),0; [XX(end,:).' YY(end,:).' ZZ(end,:).']; XX(end,end),YY(end,end),0],... 
    [XX(1,1),YY(1,1),0; XX(1,end),YY(1,end),0; XX(end,end),YY(end,end),0; XX(end,1),YY(end,1),0]}; 

for indP = 1:numel(P) 
    patch(hAx, P{indP}(:,1),P{indP}(:,2),P{indP}(:,3),'k', 'FaceColor', 'y', 'FaceAlpha', 0.7); 
end 

end 

正如你可能會注意到,輔助功能draw5Poly是專爲這樣一個場景,你只需要想象每軸一個這樣的體積。如果你用兩個表面/體積來做這件事,如果所有的「牆壁」都是黃色的,可能很難理解 - 因此,你可能想爲該功能輸入FaceColor(這樣你可以用不同的顏色繪製不同的體積)。

+0

這正是我所需要的。非常感謝! –