This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.2)

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  Die Struktur von Grafik und Ton /

Koordinatensysteme für dreidimensionale GrafikBeleuchtung und Oberflächeneigenschaften

2.9.11 Zeichnen dreidimensionaler Oberflächen

Mit einer geeigneten Liste von Grafik-Primitiven können Sie in Mathematica mit Graphics3D jedes beliebige dreidimensionale Objekt darstellen. Dreidimensionale Oberflächen können mit Graphics3D dargestellt werden, indem eine explizite Liste von Polygonen mit benachbarten Kanten angegeben wird.

Wenn Sie beliebige Oberflächen darstellen müssen, die möglicherweise in sich selbst gefaltet sind und sich selbst schneiden können, haben Sie keine andere Wahl, als explizite Listen von Polygonen mit Graphics3D zu verwenden, so wie es ParametricPlot3D tut.

Jedoch erhalten Sie in vielen Fällen einfachere Oberflächen. Plot3D und ListPlot3D liefern beispielsweise Oberflächen, die nie übereinandergefaltet sind und in jedem -Punkt eine definierte Höhe haben. In Mathematica können Sie einfache Oberflächen wie diese ohne Angabe einer expliziten Liste von Polygonen darstellen. Stattdessen brauchen Sie nur ein Array anzugeben, das die -Höhe in jedem Punkt eines -Gitters spezifiziert. Das Grafik-Objekt SurfaceGraphics[array] repräsentiert eine so konstruierte Oberfläche.

Dreidimensionale Grafik-Objekte

Hier ist ein Werte-Array.

In[1]:= moda = Table[Mod[i, j], {i, 4}, {j, 4}]

Out[1]=

Dies benutzt das Array, um die Höhe jedes Punktes der Oberfläche anzugeben.

In[2]:= Show[SurfaceGraphics[moda]]

Out[2]=

Sowohl Plot3D als auch ListPlot3D erzeugen SurfaceGraphics-Objekte.

Konvertierung von Oberflächendarstellungen

Wenn Sie Graphics3D auf ein SurfaceGraphics-Objekt anwenden, wird Mathematica ein Graphics3D-Objekt erzeugen, das eine explizite Liste von Polygonen enthält, die die Oberfläche im SurfaceGraphics-Objekt repräsentiert. Immer wenn Sie Mathematica auffordern, zwei SurfaceGraphics-Objekte miteinander zu kombinieren, konvertiert es beide automatisch in Graphics3D-Objekte.

Hier wird eine Oberfläche durch ein SurfaceGraphics-Objekt repräsentiert.

In[3]:= Plot3D[(1 - Sin[x]) (2 - Cos[2 y]),
{x, -2, 2}, {y, -2, 2}]

Out[3]=

Hier ist eine andere Oberfläche.

In[4]:= Plot3D[(2 + Sin[x]) (1 + Cos[2 y]),
{x, -2, 2}, {y, -2, 2}]

Out[4]=

Mathematica zeigt die beiden Oberflächen gemeinsam, indem es jede in ein Graphics3D-Objekt konvertiert, das eine explizite Liste von Polygonen enthält.

In[5]:= Show[%, %%]

Out[5]=

Gitternetz-Optionen in SurfaceGraphics

Wenn Sie mit SurfaceGraphics eine Oberfläche erzeugen, wird in der Voreinstellung auf der Oberfläche ein rechtwinkliges Gitternetz gezeichnet. Die Verwendung dieses Gitternetzes erleichtert es einem in der Regel, die Gestalt der Oberfläche zu erkennen (siehe Abschnitt 1.9.7). Dennoch läßt sich das Gitternetz auch durch die Options-Einstellung Mesh -> False beseitigen. Sie können auch die Option MeshStyle gleich einer Liste von Grafikanweisungen setzen, die die Dicke, die Farbe oder andere Eigenschaften der Gitternetzlinien spezifizieren.

Ein SurfaceGraphics-Objekt enthält ein Array mit Werten, die die Höhen einer Oberfläche in den Punkten eines , -Gitters angeben. Durch Einstellung der Option MeshRange können Sie den Bereich der ursprünglichen - und -Koordinaten angeben, die den Punkten in diesem Gitter entsprechen. Wenn Sie Plot3D[f, x, xmin, xmax, y, ymin, ymax] zur Erzeugung eines SurfaceGraphics-Objektes benutzen, wird automatisch die Einstellung MeshRange -> xmin, xmax, ymin, ymax erzeugt. Die Einstellung für MeshRange wird bei der Beschriftung der - und -Achsen in Oberflächendiagrammen benutzt und auch bei der Bestimmung der Polygonkoordinaten, wenn Sie ein SurfaceGraphics-Objekt in eine explizite Liste von Polygonen in einem Graphics3D-Objekt konvertieren.

Einstellungen für die ClipFill-Option

Die Option PlotRange funktioniert bei SurfaceGraphics wie bei anderen grafischen Objekten in Mathematica. Alle Teile einer Oberfläche, die außerhalb des durch PlotRange definierten Koordinatenbereiches liegen, werden „abgeschnitten". Mit der Option ClipFill können Sie angeben, was mit den weggeschnittenen Teilen einer Oberfläche geschehen soll.

Hier ist ein dreidimensionales Diagramm, in dem die Oberfläche oben und unten abgeschnitten wurde. Mit der Voreinstellung für ClipFill werden die abgeschnittenen Teile so gezeigt, als wenn sie Teil der eigentlichen Oberfläche wären.

In[6]:= Plot3D[Sin[x y], {x, 0, 3}, {y, 0, 3},
PlotRange -> {-.5, .5}]

Out[6]=

Mit ClipFill->None werden die abgeschnittenen Teile der Oberfläche weggelassen, so daß Sie dort durch die Oberfläche „hindurchsehen" können. Mathematica läßt stets die Teile der Oberfläche weg, denen Stellen entsprechen, an denen der Wert der gezeichneten Funktion keine reelle Zahl ist.

In[7]:= Show[%, ClipFill -> None]

Out[7]=

Hier wird die untere weggeschnittene Seite weiß (Graustufe 1) und die obere schwarz dargestellt.

In[8]:= Show[%, ClipFill -> {GrayLevel[1], GrayLevel[0]}]

Out[8]=

Wenn Mathematica eine Oberfläche zeichnet, muß es nicht nur die Höhe, sondern auch die Farbe der Oberfläche an jedem Punkt kennen. Mit der Voreinstellung Lighting -> True färbt Mathematica die Oberfläche mit einem Beleuchtungsmodell. Bei Lighting -> False benutzt Mathematica jedoch eine „Färbefunktion", um die Einfärbung der Oberfläche festzulegen.

Die Vorgabe-Färbefunktion hat als Argument die Höhe der Oberfläche, die so normalisiert ist, daß sie von 0 bis 1 läuft, und färbt jeden Teil der Oberfläche mit einer der Höhe entsprechenden Graustufe. Es gibt zwei Möglichkeiten, die Voreinstellung zu ändern.

Erstens: Wenn Sie die Option ColorFunction -> c setzen, dann wird Mathematica die Funktion c auf jeden Höhenwert anwenden, um die Farbe festzulegen, die an diesem Punkt benutzt werden soll. Mit ColorFunction -> Hue wird Mathematica zum Beispiel die Oberfläche mit einem Farbtonbereich färben.

Spezifikation von Funktionen zur Färbung von Oberflächen

Bei Lighting -> False gilt die Vorgabe, die Oberflächen mit Grauwerten einzufärben, die sich jeweils aus der Höhe ergeben.

In[9]:= exp = Plot3D[Exp[-Sqrt[x^2 + y^2]],
{x, -2, 2}, {y, -2, 2}, Lighting -> False,
PlotPoints -> 25]

Out[9]=

Dies definiert eine Funktion, die den Wertebereich abwechselnd auf Schwarz und Weiß abbildet.

In[10]:= streifen[f_] :=
If[Mod[f, 1] > 0.5, GrayLevel[1], GrayLevel[0]]

Dies zeigt die Oberfläche mit schwarzen und weißen Streifen eingefärbt.

In[11]:= Show[exp, ColorFunction -> (streifen[5 #]&)]

Out[11]=

Die zweite Möglichkeit, die Voreinstellung für die Oberflächenfärbung zu ändern, besteht darin, neben dem Höhen-Array ein explizites zweites Array bereitzustellen. ColorFunction wird dann auf die Elemente dieses zweiten Arrays statt auf das Höhen-Array angewendet, um die zu verwendenden Farbanweisungen herauszufinden. Im zweiten Array können Sie im Grunde für jeden Punkt auf der Oberfläche den Wert einer anderen Koordinate angeben. Diese Koordinate ergibt dann die Farbe statt der Position.

Sie können ein Array von Farbwerten automatisch mit Plot3D[f, s, ... ] erzeugen. Wenn Sie das Array explizit in ListPlot3D oder SurfaceGraphics angeben, sollten Sie sich bewußt machen, daß Sie für ein -Array von Höhen ein -Array für die Angabe der Farben benötigen. Der Grund dafür ist, daß die Höhen für Punkte auf einem Gitter, die Farben aber für Quadrate auf dem Gitter spezifiziert werden.

Wenn Sie eine zweite Funktion oder ein zweites Array für Plot3D, ListPlot3D und so weiter bereitstellen, ist die Voreinstellung für die ColorFunction-Option Automatic. Deshalb sollte die Funktion oder das Array explizite Mathematica-Farbanweisungen, wie zum Beispiel GrayLevel oder RGBColor, enthalten. Wenn Sie jedoch eine andere Einstellung, wie beispielsweise ColorFunction -> Hue, festlegen, dann können die Funktion oder das Array reine Zahlen oder andere Daten ergeben, die in Farbanweisungen konvertiert werden, wenn die durch ColorFunction spezifizierte Funktion angewandt wird.

Spezifikation von Farb-Arrays für Oberflächen

Dies zeichnet eine Oberfläche mit Graustufen, die durch die -Koordinate festgelegt werden.

In[12]:= Plot3D[{Sin[x] Sin[y]^2, GrayLevel[y/3]},
{x, 0, 3}, {y, 0, 3}]

Out[12]=

Dies legt eine zufällige Graustufe in jedes Gitterquadrat. Beachten Sie, daß das Array der Gitterquadrate eine Größe von hat, das Array der Gitterpunkte dagegen ist.

In[13]:= ListPlot3D[ Table[i/j, {i, 10}, {j, 10}],
Table[GrayLevel[Random[ ]], {i, 9}, {j, 9}] ]

Out[13]=

Koordinatensysteme für dreidimensionale GrafikBeleuchtung und Oberflächeneigenschaften