7 3D-Graphik
7 3D-Graphik 64 7. Kurven im R 3 plot3 Dieser Befehl funktioniert analog wie plot, nur das hier noch ein Vektor mit den z-koordinaten hinzukommt. Wir plotten die Kurve [, 6π] R 3 : t (cos t, sin t, t). t = linspace(,6*pi,); x = cos(t); y = sin(t); z = t; plot3(x,y,z) xlabel( x ) ylabel( y ) zlabel( z ) % beschriftet die z-achse grid on
7 3D-Graphik 65 Alternativ dazu würde auch der line-befehl funktionieren: line(x,y,z).
7 3D-Graphik 66 7. Funktionen mit zwei Unbekannten, Flächen im R 3 Um Funktionen mit einer Unbekannten zu plotten wurde ein x-vektor erzeugt, d.h. ein Intervall in einzelne Punkte zerlegt, und für die Werte die Funktionswerte y = f(x) berechnet. Für Funktionen mit zwei Unbekannten benötigen wir zuerst ein Gitter. Die Funktionwerte werden dann an den Gitterpunkten berechnet. Wir erzeugen ein Gitter definiert durch den x-vektor (,.5,,.5, ) und durch den y-vektor (,, 3, 4) (Kartesisches Produkt).
7 3D-Graphik 67 4 (,4) (.5,4) (,4) (.5,4) (,4) 3 (,3) (.5,3) (,3) (.5,3) (,3) y (,) (.5,) (,) (.5,) (,) (,) (.5,) (,) (.5,) (,).5.5 x Die x-koordinaten und y-koordinaten der Gitterpunkte werden in einer 4 5 Matrix X und in einer 4 5 Matrix Y abgespeichert. Die z-koordinaten Z = f(x, Y ) werden durch elementweise Operationen berechnet.
7 3D-Graphik 68 Die Matrizen X und Y erhalten wir mit dem Befehl meshgrid: x = :.5:; y = :4; [X,Y] = meshgrid(x,y) X =.5..5..5..5..5..5..5..5. Y = 3 3 3 3 3 4 4 4 4 4
7 3D-Graphik 69 Die Matrix Y steht auf dem Kopf, da die Zeilenindizes von Y natürlich von oben nach unten wachsen. Somit ist auch (X(, ), Y (, )) der Gitterpunkt links unten, also (,). Unsere Funktion sei z = f(x, y) = x. Z = X.^ Z =.5..5 4..5..5 4..5..5 4..5..5 4.
7 3D-Graphik 7 Diese Funktion kann nun mit dem Befehl mesh gezeichnet werden: Syntax: mesh(x,y,z) oder mesh(x,y,z,c) C ist eine Matrix und dient zur Einfärbung der Fläche (siehe später). mesh(x,y,z) 4 4 Die Netzlinien sind entsprechend der Höhe (z-wert) eingefärbt.
7 3D-Graphik 7 Verschiedene Gitter Die Punkte in x und y müssen nicht äquidistant sein. x = [,,.5,.75,]; y = [,3, 3.5 4]; [X,Y] = meshgrid(x,y); 4 3.5 3 y.5.75 x
7 3D-Graphik 7 Das Gitter muss auch nicht rechteckig sein. Beispiel: Ein Gitter auf einem Viertelkreisring. Ein rechteckiges Gitter wird in ein Gitter auf einem Viertelkreisring transformiert. Mit Hilfe der Abbildung (Polarkoordinaten) x(r, ϕ) = r cos ϕ, y(r, ϕ) = r sin ϕ mit r [, ] und ϕ [, pi/]. r = linspace(,,5); phi = linspace(,pi/,); [R,PHI] = meshgrid(r,phi); X = R.*cos(PHI); Y = R.*sin(PHI);
7 3D-Graphik 73.5 phi.5 y.5 r x Es können nur Gitter erzeugt werden, die man durch Transformation aus einem rechteckigen Gitter (Matrix) erhält. Es können aber Teile des Gitters weggelassen werden indem Elemente der Matrizen X, Y oder Z mit NaN (Not a Number) belegt werden.
7 3D-Graphik 74 Wir zeichnen nun auf dem Viertelkreisring die in kartesischen Koordinaten gegebene Funktion z = f(x, y) = x : Z = X.^; mesh(x,y,z) 4
7 3D-Graphik 75 Jetzt zeichnen wir die in Polarkoordinaten gegebene Funktion z = g(r, ϕ) = r = x + y. Die Funktion wird auf dem (r, ϕ)-gitter berechnet. Bei der Transformation auf den Viertelkreisring werden die Funktionswerte einfach mitgenommen. Z = R.^; mesh(x,y,z) 4 3
7 3D-Graphik 76 Eine Fläche kann auch durch eine Parametrisierung mit zwei Parametern erzeugt werden. Beispiel: x = cos s, y = t, z = sin t mit s [, π] und t [, 5]. s = linspace(,pi,9); t = linspace(,5,9); [S,T] = meshgrid(s,t); X = *cos(s); Y = T; Z = *sin(s); mesh(x,y,z) axis equal
7 3D-Graphik 77 z 5 4 y 3 x
7 3D-Graphik 78 Der Befehl surf Der Aufruf wie bei mesh. Unterschied: Die Fläche ist schattiert. Mit den Matrizen aus dem vorigen Beispiel erhalten wir mit surf(x,y,z): z 5 4 y 3 x Default-Einstellung: Facetten werden eingefärbt, zusätzlich werden Gitterlinien gezeichnet.
7 3D-Graphik 79 Mit dem Befehl shading können diese Einstellungen geändert werden. shading flat Gitterlinien werden nicht gezeichnet shading interp Farbverlauf durch Interpolation shading facetted default z 5 shading flat z 5 shading interp y x y x
7 3D-Graphik 8 Der Befehl colormap Eine Farbkarte wird mit dem Befehl colormap festgelegt. Syntax: colormap(map) map ist eine n 3- Matrix. In jeder Zeile steht die Definition einer RGB-Farbe. Dies ist jeweils ein 3 Vektor mit Werten zwischen und für rot, grün, und blau. Syntax: map = colormap Auslesen der aktuellen Farbkarte in die Matrix map. Mit den Befehlen hsv, jet,... werden 64 x 3 Matrizen definiert. Mit hsv(n), jet(n),... n 3-Matrizen
7 3D-Graphik 8 hsv jet gray cool hot spring summer autumn winter copper bone white pink colorcube lines flag prism
7 3D-Graphik 8 Selbstdefinierte Farben: t = linspace(,,6) ; map = [t,ones(length(t),)/]; map =.5.5..5.5.4.5.5.6.5.5.8.5.5..5.5 surf(x,y,z) colormap(map) shading interp
7 3D-Graphik 83 5
7 3D-Graphik 84 Mit 8 Farben: 5 Je mehr Zeilen die Matrix map enthält (mehr Farben), desto feiner ist der Farbverlauf. Die Farben wurden entsprechend dem Wert der z-koordinate der Gitterpunkte gewählt. In unserem Beispiel wird das Intervall [,] (kleinster und größter z-wert) auf das Intervall [, Anzahl Farben] abgebildet und auf ganze Zahlen
7 3D-Graphik 85 gerundet. Der Befehl caxis([cmin, cmax]) bestimmt welches Intervall [cmin, cmax] auf die Farbkarte abgebildet wird. mesh(x,y,z,c), surf(x,y,z,c) Fall shading facetted oder shading flat: C muss eine (m ) (n )-Matrix sein ([m,n]=size(z)). C(i,j) wird auf die Farbkarte abgebildet und bestimmt Farbe der Facette. Fall shading interp: C muss eine m n-matrix sein ([m,n]=size(z)). C(i,j) wird auf die Farbkarte abgebildet und bestimmt die Farbe der Gitterpunkte für die Interpolation.
7 3D-Graphik 86 Beispiel: Die Temperatur des Zylindermantels sei durch folgende Funktion definiert: T (s, t) = ( t). sin(s) (auf dem (s, t)-gitter des Zylindermantels) Der Befehl colorbar zeichnet eine Farbskala. temp = *(-T).*sin(S); surf(x,y,z,temp) colormap(jet(8)) shading interp colorbar
7 3D-Graphik 87 8 6 4 5
7 3D-Graphik 88 Falls es stört, dass auch positive Temperaturen blau dargestellt werden: caxis([-,]) colorbar 5 5 5
7 3D-Graphik 89 Die Blickrichtung einstellen, view view([az,el]) view([x,y,z]) [az,el] = view view() view(3) Azimuth und Elevation setzen. [x,y,z] Vektor, der die Blickrichtung bestimmt. Azimuth und Elevation auslesen. -dimensional. 3-dimensional.
7 3D-Graphik 9 Die Blickrichtung kann auch mit der Maus eingestellt werden. Taste ganz rechts in der Toolbar des Graphikfensters drücken.
7 3D-Graphik 9 Weitere Befehle für Flächen meshc, surfc: Wie mesh bzw. surf. Es werden zusätzlich Höhenlinien gezeichnet. meshz: Wie mesh. Ein Vorhang hängt an den Seiten herunter. surfl: Wie surf. Die Fläche wird aber beleuchtet
7 3D-Graphik 9 7.3 Höhenlinien contour(x,y,z) Zeichnet die z-werte als Höhenlinien, X, Y und Z sind Matrizen wie für mesh und surf. contour(x,y,z,n) Zeichnet n Höhenlinien (äquidistant). contour(x,y,z,v) Der Vektor v enthält die Niveaus, für die Höhenlinien gezeichnet werden. Falls nur eine Höhenlinie gezeichnet werden soll, muss v das Niveau zweimal enthalten (z.b.: v = [,]). Die Beschriftung der Höhenlinien erfolgt mit clabel. [c,h] = contour(argumente wie oben); clabel(c,h) contourf Wie contour, die Bereiche zwischen den Höhenlinien sind, je nach Niveau, eingefärbt. Auch die Befehle shading und colormap können hier verwendet werden.
7 3D-Graphik 93 7.4 Vektorfelder quiver(x,y,vx,vy) zeichnet Vektoren (VX(i,j),VY(i,j)) in den Punkten (X(i,j),Y(i,j)). Mit [VX,VY]=gradient(Z,x,y) kann das Gradientenfeld einer Fläche z = f(x, y) auf einem rechteckigen Gitter numerisch berechnet werden. Die Vektoren x und y sind jene Vektoren, die die Matrizen X und Y mit meshgrid erzeugen. Damit man die Vektoren erkennen kann, sollte ein grobes Gitter verwendet werden. Die Vektoren sind mit einem gemeinsamen Faktor skaliert, haben also im Allg. nicht die wirkliche Länge.
7 3D-Graphik 94 7.5 Beispiele zu contour, quiver und gradient, surfl, surfc, meshz x = linspace(-,,); y = linspace(-,,); [X,Y] = meshgrid(x,y); Z = X.*exp(-(X-Y).^); % contour figure() contour(x,y,z) title( contour(x,y,z) ) figure() [c,h] = contour(x,y,z,-:.:); clabel(c,h); title( contour(x,y,z,-:.:) )
7 3D-Graphik 95 figure(3) contourf(x,y,z,-:.:); colorbar title( contourf(x,y,z,-:.:) ) % quiver figure(4) x_grob = -:.:; y_grob = -:.:; [X_grob,Y_grob] = meshgrid(x_grob,y_grob); Z_grob = X_grob.*exp(-(X_grob-Y_grob).^); [GRAD_Z_X,GRAD_Z_Y] = gradient(z_grob,y_grob,y_grob); quiver(x_grob,y_grob,grad_z_x,grad_z_y) hold on contour(x,y,z,-:.:); axis([-,,-,]) hold off title( quiver und contour )
7 3D-Graphik 96 % surfl figure(5) surfl(x,y,z) colormap(gray) shading interp title( surfl(x,y,z) ) % surfc figure(6) surfc(x,y,z) colormap(copper) shading interp title( surfc(x,y,z) ) % meshz figure(7) meshz(x_grob,y_grob,z_grob) shading interp title( meshz(x_grob,y_grob,z_grob )
7 3D-Graphik 97 contour(x,y,z) contour(x,y,z,-:.:) -...4..3.5.7.6 -.5 -.6 -.4 -.3 -. contourf(x,y,z,-:.:).5 quiver und contour.5
7 3D-Graphik 98 surfl(x,y,z) surfc(x,y,z) meshz(xgrob,ygrob,zgrob)
7 3D-Graphik 99 7.6 Flächen durch beliebig angeordnete Datenpunkte Matlab bietet auch die Möglichkeit Flächen durch Datenpunkte zu zeichnen, deren Anordnung nicht auf ein rechteckiges Gitter basiert. Mit delaunay und trimesh bzw. trisurf Es seien die x- und y-koordinaten der Punkte in den Vektoren x und y sowie z = f(x, y) im Vektor z abgespeichert. tri = delaunay(x,y) erzeugt eine Triangulierung durch die Punkte (x(i),y(i)). tri ist eine n 3-Matrix, in der in jeder Zeile ein Dreieck durch drei Knotennummern (= Index für die Koordinaten in x und y) definiert ist. Um eine Fläche über dieser Triangulierung zu zeichnen, werden die Befehle trimesh(tri,x,y,z) und trisurf(tri,x,y,z) verwendet.
7 3D-Graphik Mit griddata, Umrechnen auf ein rechteckiges Gitter Wir erzeugen mit meshgrid Matrizen X Gitter und Y Gitter, d.h. ein rechteckiges Gitter. Mit Z Gitter = griddata(x,y,z,x Gitter,Y Gitter) werden durch lineare Interpolation die z-werte über dem Gitter berechnet. Dazu wird von griddata zuerst mit delaunay eine Triangulierung berechnet. Die Gitterpunkte (X Gitter(i,j),Y Gitter(i,j),Z Gitter(i,j)) liegen auf den Dreiecken (Ebenen) im R 3. Diese Verfahrensweise hat den Vorteil, dass wieder alle obigen Befehle wie surf, contour,... verwendet werden können. Statt linearer Interpolation kann auch kubische Interpolation verwendet werden. Dazu ist als sechstes Argument cubic zu übergeben.
7 3D-Graphik x = rand(5,)*-; y = rand(5,)*-; z = x.*exp(-(x-y).^); % delaunay tri = delaunay(x,y); % Gitter figure() trisurf(tri,x,y,zeros(size(x))) hold on plot(x,y, o ) view() hold off title( Triangulierung ) % trisurf figure() trisurf(tri,x,y,z) title( trisurf(tri,x,y,z) ) printit( ugrid )
7 3D-Graphik % trisurf shading interp figure(3) trisurf(tri,x,y,z) shading interp title( trisurf(tri,x,y,z), shading interp ) % mit griddata cubic figure(4) xi = linspace(-,,5); yi = linspace(-,,5); [XI,YI] = meshgrid(xi,yi); ZI = griddata(x,y,z,xi,yi, cubic ); surf(xi,yi,zi) title( mit griddata )
7 3D-Graphik 3 Triangulierung trisurf(tri,x,y,z) trisurf(tri,x,y,z), shading interp mit griddata