使用contourslice获得等值面边界?

时间:2016-05-08 12:15:54

标签: matlab matlab-figure matlab-guide

我有一个问题。我目前有一个3D表面的数据描述了一个复杂的三角函数f(rho1,rho2,beta)= 0.我使用isosurface获得了这个数据:

[rho1,rho2,beta] = meshgrid(linspace(pi,0,100),linspace(0,pi,100),linspace(0,pi/2,100));

data = sin(rho1).*sin(rho2) + sin(beta).^3 + cos(2.*beta).*sin(beta).*cos(rho2) + sin(beta).^3.*cos(rho1).*cos(rho2).^2 + cos(2.*beta).*sin(beta).*cos(rho1).*cos(rho2) - cos(beta).^2.*sin(beta).*cos(rho1) + sin(beta).*cos(rho1).*sin(rho2).^2 + 2.*cos(beta).^2.*sin(rho1).*sin(rho2) + cos(beta).^2.*sin(beta).*cos(rho2).^2 + 2.*sin(beta).^2.*cos(rho2).*sin(rho1).*sin(rho2);

fv = isosurface(rho1,rho2,beta,data,0);
p = patch(fv);
isonormals(rho1,rho2,beta,data,p)
p.FaceColor = 'red';
p.EdgeColor = 'none';
daspect([1,1,1])
view(3); axis tight
camlight  
lighting gouraud

我试图在3D中绘制几个"切片"这个表面。目前我正在使用contourslice。据我所知,这个函数根据表面的体积表示来插值轮廓。我想让轮廓完全(或尽可能接近数字)到我的体积边界。我目前有这个:

hold on
s = contourslice(rho1, rho2, beta, data, [], [], [pi/4], 1, 'nearest'); 
view(3); 
grid on;

是pi / 4中的一个z切片,使用"最近的"插值方法。这不能给我我想要的东西。

非常感谢任何帮助...

this image shows how the contour does not match my surface

1 个答案:

答案 0 :(得分:1)

我能够通过使用isosurface函数中的face / vertex数据并将这些向量组合成一个循环来找到各种答案,该循环找到给定某个z值的x,y对:

fv = isosurface(rho1,rho2,beta,data,0);
x=fv.vertices(:,1); y=fv.vertices(:,2); z=fv.vertices(:,3);
x_ring = [];
y_ring = [];
for i =1:length(z)
    if z(i)>pi/4-.01 && z(i)<pi/4+.01
        x_ring = [x_ring x(i)];
        y_ring = [y_ring y(i)];
    end
end
z_ring = ones(length(x_ring))*pi/4;

此代码在某个z值的任一侧获取一系列值,并将这些点展平到目标z上。

使用matlab中的boundary命令,我们可以找到位于从循环中收集的点的边界上的点集。边界返回点和区域:

[k, area] = boundary(x_ring',y_ring');
hold on
plot3(x_ring(k)',y_ring(k)',z_ring(k)')

这应该给出一个基于“切片”宽度的~1%的近似面积。

你同意吗?