2016-05-08 8 views
2

私は問題があります。 、contoursliceを使用して等値面境界を取得していますか?

[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で、プロットしようとしています:私は現在、私はそうと等値面を使用してこのデータを取得した3次元の複雑な三角関数fを記述表面(rho1、rho2、ベータ)= 0のデータを持っていますこの表面のいくつかの「スライス」。現在、私はcontoursliceを使用しています。私はこの機能が私の表面の容積表示に基づいて輪郭を補間することを理解する。輪郭線をボリュームの境界線に正確に(または数値的に可能な限り)近づけたいと思います。現在、私はこれを持っています:

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

これは、 "最も近い"補間方法を使ってpi/4で1つのzスライスです。これは私が欲しいものを私に与えません。

任意の助けを大幅に高く評価され...

this image shows how the contour does not match my surface

答えて

1

Iは、等値面関数から顔/頂点データを使用して見つけループにこれらのベクターを組み立てることによってある種の答えを見つけることができましたX、Yのペアは、特定のz値が与えられ:

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%以内のおおよその面積を示します。

あなたは同意しますか?

関連する問題