2017-11-18 113 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

这正是我所需要的。非常感谢! –