2016-06-17 22 views
1

Ich habe die folgende Abbildung, wo ich zwei Oberflächen geplottet und ich wollte die Schnittmenge von ihnen beiden angeben. Um das zu tun, habe ich folgende:Berechnung der Oberfläche zwischen zwei Linien

zdiff = z1-z2; 
C = contours(x,y,zdiff,[0 0]); 
xL = C(1, 2:end); 
yL = C(2, 2:end); 
zL = interp2(x, y, z1, xL, yL); 
line(xL, yL, zL, 'Color', 'k', 'LineWidth', 2,'Linestyle','--'); hold on; 
line(xL, yL, zeros(size(zL)), 'Color', 'k', 'LineWidth', 2); hold off; 

Nun, ich will Grundstück die vertikale Fläche zwischen der tatsächlichen Schnittpunkt (gestrichelte Linie) und seiner Projektion über XY (durchgezogene Linie), aber ich kann nicht herausfinden, wie geht das. Irgendwelche Ideen?

Intersection of both surfaces

+0

Haben Sie den Wert der Oberfläche berechnet werden soll, ODER möchtest du die Oberfläche zeichnen? – BerndGit

+0

Eigentlich Zeichnen der Oberfläche –

Antwort

2

andere wirklich einfache Möglichkeit:

dist = (diff(xL).^2+diff(yL).^2).^0.5; %distance between x,y 
cdist = [0, cumsum(dist)]; %cumsum of the distance 
area = trapz(cdist,zL); %The area 
+0

Elegant. Danke, dass Sie mich den 'diff'-Befehl bemerken. – BerndGit

+0

Entschuldigung, ich meinte, die Oberfläche zu zeichnen. –

0

Warum Berechnung nicht manuell?

So etwas (nicht getestet):

Area = 0 
for i=1:numel(xL)-1 
    base = sqrt( (xL(i)-xL(i+1))^2 + (yL(i)-yL(i+1))^2); 
    Area =Area + base * (zL(i) + zL(i+1))/2; 
end; 
0

vielleicht nicht schön, aber es ist ein oneliner es könnte den Trick tun. vielleicht müssen Sie das Format einstellen, wie dieser Code für (1, N) Vektoren

xL=(1:100); %size 1 100 
    yL=(1:100) ;%size 1 100 
    zL=rand(1,100);%size 1 100 

    line(xL,yL,zL) 
    line(xL,yL,zeros(size(zL))) 
    hold on 
    surf(repmat(xL,100,1),repmat(yL,100,1),cell2mat(arrayfun(@(x,y) linspace(x,y,100)',zL,zeros(size(zL)),'UniformOutput',false))) 
0
xL=sin((1:30)/10); % Data generation for test only. Use your data 
yL=cos((1:30)/10); % Data generation for test only. Use your data 
zL=2+xL.*yL;  % Data generation for test only. Use your data 
surf([xL;xL],[yL;yL],[zeros(size(zL));zL]); % plot the surface