2016-07-09 11 views
1

Für mein Tutorial zum Beispiel das Zeilenintegral für z = x + iy über den Einheitskreis. Daher möchte ich die Höhenbereiche für jedes Teil darstellen, wie einen Vorhang dazwischen. So wird zuerst meine Hauptkurve ist z (x, y) = x:Wie kann ich den Bereich zwischen zwei 3D-Kurven schattieren? Wie zeichne ich einen Vorhang zwischen ihnen?

th = linspace(0,2*pi,40); 
r = linspace(4,4.5,40); 
[TH,R] = meshgrid(th,r); 
[X,Y] = pol2cart(TH,R); 
Z = X; 

und dann fügte ich die xy-Ebene (z = 0):

mesh(X,Y,Z); 
hold on; 
% Z threshold value. 
threshold = .0001; % please change this as needed 
% Obtain the limits of the axes 
yp = get(gca,'Ylim'); 
xp = get(gca,'Xlim'); 
% Use the axes x and Y limits to find the co-ordinates for the patch 
x1 = [ xp(1) xp(2) xp(2) xp(1)]; 
y1 = [ yp(1) yp(1) yp(2) yp(2)]; 
z1 = ones(1,numel(x1))* threshold; % creates a 1x4 vector representing the Z coordinate values 
p = patch(x1,y1,z1, 'b'); 
% Set the Face and edge transparency to 0.2 using the following properties 
set(p,'facealpha',0.2) 
set(p,'edgealpha',0.2) 

circle and plane

Jetzt möchte ich den Bereich von der xy-Ebene und die Kurve z (x, y) = x wie ein Vorhang zwischen ihnen begrenzt befüllen. Hier ist ein Beispiel dafür, was ich meine die Idee zu bekommen:
example

Kann dies mit fill3 oder waterfall getan werden? Noch besser wäre es, die oberen und unteren Vorhänge unterschiedliche Farben zu haben, um zu verdeutlichen, dass sie sich aufheben.

Ich kann auch C++ oder Mathematica versuchen, wenn Sie möchten.

Antwort

1

Eine Möglichkeit, dies zu tun, ist die Verwendung surf, mit einem benutzerdefinierten FaceColor und FaceAlpha angewendet werden. Daher können Sie die Koordinaten xF und yF wiederholen, um die vollständige Kontur zu erstellen, indem Sie zF als eine gebundene und dann den z-Wert der xy-Ebene (z = 0) als die andere gebunden verwenden.

surf(repmat(xF,2,1), repmat(yF,2,1), [zF;ones(size(zF))*0], ... 
    'FaceColor','r', 'FaceAlpha', 0.2); 

xF, yF und zF können, was Punkte, die Sie mögen. So können Sie den oberen Teil und den unteren Teil einfach aufteilen und die entsprechenden Koordinaten auf die gleiche Weise wie für den Kreis erstellen.


Das Ergebnis kann zum Beispiel wie folgt aussehen: result

Es gibt einige andere mögliche Verbesserungen meiner Meinung nach, die in den Code zu sehen ist erforderlich, um das obige Bild zu erstellen. Dies ist der komplette Code dafür:

radius = 1;     % radius of the circle projected onto xy-plane 
xlim = [-1.25,1.25];  % x-limits 
ylim = xlim;    % y-limits 
zlim = [-1.25,1.25];  % z-limits 

% create new figure, set limits and view 
figure; hold on; grid on; 
set(gca,'XLim',xlim); 
set(gca,'YLim',ylim); 
set(gca,'ZLim',zlim); 
%view(3); 
view([-26,12]); 

% draw circle 
th = linspace(0,2*pi,40); 
r = radius * [0.97,1.03]; % the area in between is filled by surf 
[TH,R] = meshgrid(th,r); 
[X,Y] = pol2cart(TH,R); 
Z = X; 
surf(X,Y,Z);    % plot as surface not patch 
shading interp;    % remove the edge lines 

% draw xy-plane 
x1 = [xlim,fliplr(xlim)]; 
y1 = repelem(ylim,1,2); 
z1 = ones(size(x1))*0; 
patch(x1,y1,z1, 'k', 'FaceAlpha',0.2, 'EdgeColor','none'); 

% draw upper curtain 
th = linspace(-pi/2,pi/2,40); 
[xF,yF] = pol2cart(th,radius); 
zF = xF; 
surf(repmat(xF,2,1), repmat(yF,2,1), [zF;ones(size(zF))*0], ... 
    'FaceColor',[0.85,0.325,0.098], 'FaceAlpha', 0.2); 

% draw lower curtain 
th = linspace(pi/2,3*pi/2,40); 
[xF,yF] = pol2cart(th,radius); 
zF = xF; 
surf(repmat(xF,2,1), repmat(yF,2,1), [zF;ones(size(zF))*0], ... 
    'FaceColor',[0.301,0.745,0.933], 'FaceAlpha', 0.2); 

Statt eine Oberfläche mit dem Kreis zu zeichnen, können Sie auch eine normale Linie in 3D-Raum plot3 wie unten gezeigt mit ziehen könnten. Es wäre jedoch nicht möglich (ohne etwas zu hacken), abhängig von der Höhe mehrere Farben zu haben.

th = linspace(0,2*pi,40); 
[X,Y] = pol2cart(th,radius); 
Z = X; 
plot3(X,Y,Z, 'r', 'LineWidth',3); 

Es würde so aussehen:

result2