2016-05-08 9 views
2

Ich habe ein Problem. Ich habe derzeit Daten für eine 3D-Oberfläche, die eine komplizierte trigonometrische Funktion f (rho1, Rho2, beta) = 0. ich diese Daten isosurface wie so erhalten unter Verwendung von beschreibt:Erhalten Isoflächengrenze mit 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 

Ich versuche, zu zeichnen, in 3D, mehrere "Scheiben" dieser Oberfläche. Momentan benutze ich contourslice. Ich verstehe, dass diese Funktion Konturen basierend auf der volumetrischen Darstellung meiner Oberfläche interpoliert. Ich möchte, dass die Konturen genau (oder so nah wie möglich) an der Grenze meines Volumens liegen. Ich habe derzeit dies:

das ist ein z Scheibe bei Pi/4 mit der "nächsten" Interpolationsmethode. Das gibt mir nicht, was ich will.

ist jede Hilfe sehr dankbar ...

this image shows how the contour does not match my surface

Antwort

1

ich in der Lage war, eine Antwort von Sorten zu finden, indem das Gesicht/Vertexdaten aus der isosurface Funktion und Montage dieser Vektoren in eine Schleife verwenden, findet x, y-Paare einen bestimmten z-Wert angegeben:

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; 

Dieser Code führt eine Reihe von Werten, die auf beiden Seiten eines bestimmten Z-Wertes und flacht diese Punkte auf ein Ziel z.

Mit dem boundary-Befehl in Matlab können wir die Menge der Punkte finden, die auf der Grenze der Punkte liegen, die aus der Schleife gesammelt wurden. Grenze gibt die Punkte und den Bereich:

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

dies uns eine ungefähre Fläche innerhalb von ~ 1% der „Scheibe“ Breite Basis weg geben soll.

Stimmen Sie zu?