________________________________________________________________________________
Inhalt....: 3D-Polygone füllen: N-Eck, Tetraeder und Quader (Grafik)
Kategorie.: Grafik
Mathematik: Grafik
MuPAD.....: 3.1.1
Datum.....: 2005-07-04
Autoren...: Andreas Sorgatz <sorgatz@sciface.com>
Funktionen: plot, plot::SurfaceSet, MeshListType, TriangleFan, plot::Polygon3d
Funktionen: Closed, MeshVisible, PointsVisible
________________________________________________________________________________
3D-Polygone füllen: N-Eck, Tetraeder und Quader
Dieses Arbeitsblatt demonstriert den Einsatz von MuPAD Grafikfunktionen und Grafikoptionen
anhand eines Beispiels.
Nahezu beliebige 3D-Flächen können in MuPAD mittels der Funktion plot::SurfaceSet
unter Angabe von Gitterpunkten (Mesh) gezeichnet werden. Die Gitterpunkte müssen dabei die
Fläche entweder in Dreiecke (Triangle,TriangleFan,TriangleStrip) oder in
Vierecke (Quads,QuadStrip) zerlegen. plot::SurfaceSet bietet eine Low-Level
Schnittstelle zur 3D-Grafik und ist daher etwas "technisch".
3D-Polygone, die konvexe N-Ecke beschreiben, lassen sich sehr einfach und effizient über den
Netztyp Dreieckfächer (MeshListType=TriangleFan) realisieren. Wir definieren dafür
zunächst die Liste der Eckpunkte eines schräg im Raum stehenden Sechsecks:
Eckpunkte:= [
[ 3, 0, 0],
[ 2, 2, 2],
[ 0, 3, 3],
[-2, 2, 2],
[-3, 0, 0],
[-2,-2, -2],
[ 0,-3, -3],
[ 2,-2, -2]
]
![]()
Wir zeichnen das Seckseck zunächst als geschlossenes (Closed) 3D-Polygon:
plot(plot::Polygon3d(Eckpunkte,Closed)):

Im folgenden zeichnen wir die Fläche des Sechsecks mittels plot::SurfaceSet. Vor der
Version MuPAD 3.4 akzeptiert diese Funktion leider nur eine flache Liste von Gitterkoordinaten,
so dass wir die Liste der Eckpunkte zuvor konvertieren müssen:
plot(plot::SurfaceSet(
map(Eckpunkte, op), // map für MuPAD <3.4
MeshListType = TriangleFan
)
):

Um sichtbar nachzuvollziehen, wie die Fläche des Sechsecks intern als Dreieckfächer realisiert
wurde, schalten wir die Optionen MeshVisible und PointsVisible ein. Dabei werden
die Linien und Eckpunkte der Dreiecke mit eingezeichnet:
plot(plot::SurfaceSet(
map(Eckpunkte, op), // map für MuPAD <3.4
MeshListType = TriangleFan,
MeshVisible, PointsVisible
)
):

Soll das Seckseck einen sichtbaren Rand bekommen, so kombiniert man die beiden oben be-
nutzten Funktionen wie folgt:
plot(plot::SurfaceSet(
map(Eckpunkte, op), // map für MuPAD <3.4
MeshListType = TriangleFan
),
plot::Polygon3d(
Eckpunkte,
Closed,
LineColor = RGB::Black
)
):

Ähnlich können wir auch 3D-Körper erstellen. Beispielsweise einen Platonischen Körper, das
Tetraeder, das aus Dreiecksflächen besteht. Wir definieren zunächst wieder die Gitterpunkte
in Form einer Liste Dreieckskoordinaten:
Dreiecke:= [
[-1.5, -1.5, 1.4, 0.0, 1.7, 1.4, 1.5, -1.5, 1.4],
[-1.5, -1.5, 1.4, 1.5, -1.5, 1.4, 0.0, 0.0, -1.4],
[ 1.5, -1.5, 1.4, 0.0, 1.7, 1.4, 0.0, 0.0, -1.4],
[ 0.0, 1.7, 1.4, -1.5, -1.5, 1.4, 0.0, 0.0, -1.4]
]
![]()
Da es sich diesmal nicht um eine Fächerstruktur, sondern einzelne Dreiecke handelt, wird als
Netztyp Triangles gewählt:
plot(plot::SurfaceSet(
map(Dreiecke, op), // map für MuPAD <3.4
MeshListType = Triangles
)
):

Auch hier können wir die Netzlinien zuschalten, die in diesem Fall genau den Rand des Körpers
definieren:
plot(plot::SurfaceSet(
map(Dreiecke, op), // map für MuPAD <3.4
MeshListType = Triangles,
MeshVisible
)
):

Ein Quader wird entsprechend wie folgt realisiert:
Quader := [
[-1,-1,-1], [ 1,-1,-1], [ 1, 1,-1], [-1, 1,-1],
[-1,-1,-1], [-1,-1, 1], [-1, 1, 1], [-1, 1,-1],
[ 1,-1,-1], [ 1,-1, 1], [ 1, 1, 1], [ 1, 1,-1],
[-1,-1,-1], [-1,-1, 1], [ 1,-1, 1], [ 1,-1,-1],
[-1, 1,-1], [-1, 1, 1], [ 1, 1, 1], [ 1, 1,-1],
[-1,-1, 1], [ 1,-1, 1], [ 1, 1, 1], [-1, 1, 1]
]:
plot(plot::SurfaceSet(
map(Quader, op), // map für MuPAD <3.4
MeshListType = Quads,
MeshVisible
)
):

Anmerkungen zu plot::SurfaceSet:
- MuPAD arbeitet mit einem Beleuchtungsmodell, das auch Reflexe darstellt. Um Flächen und
Körper sauber darzustellen, sollte immer spezifiziert werden wo "innen" und "aussen" einer
Fläche ist. In der Regel gibt man die Koordinaten einer ebenen Teilfläche (Dreieck | Viereck)
dazu gegen den Uhrzeigersinn, also mathematisch positiver Reihenfolge an. Alternativ können
aber auch Normalenvektoren definiert werden, mehr dazu auf der Hilfeseite zu dieser Funktion.
- Ab Version MuPAD Pro 3.4 können die Koordinaten der Gitternetzwerke (MeshList) frei
in bis zu zwei-stufigen Unterlisten gruppiert werden. Also beispielsweise jeder Punkt als eine
Punktliste [x,y,z] und beliebige viele Punkte wieder in einer Elementliste, die dann in einer
Gesamtliste zusammengefasst werden. Dies ist übersichtlicher und häufig auch bequemer.
- Die Funktion erlaubt auch animierte Gitternetzwerke (MeshList). Dazu wird ein Gitternetz
definiert in dem ein Parameter 'a' auftritt, als Zusatzargument erhält die Funktion dann noch
den Animationsbereich, beispielsweise a=0..PI. Als Beispiel ziehen wir an einer Ecke des
Quaders:
Quader := [
-1,-1,-1, 1,-1,-1, 1, 1,-1, -1, 1,-1,
-1,-1,-1, -1,-1, a, -1, 1, 1, -1, 1,-1,
1,-1,-1, 1,-1, 1, 1, 1, 1, 1, 1,-1,
-1,-1,-1, -1,-1, a, 1,-1, 1, 1,-1,-1,
-1, 1,-1, -1, 1, 1, 1, 1, 1, 1, 1,-1,
-1,-1, a, 1,-1, 1, 1, 1, 1, -1, 1, 1
]:
plot(plot::SurfaceSet(
Quader, MeshListType = Quads,
MeshVisible, PointsVisible,
a=2..1,
TimeRange = 0..1,
AnimationStyle = BackAndForth
)
):

________________________________________________________________________________
Anmerkungen:
1. Weitere Anregungen zum Einsatz von MuPAD in der Lehre finden Sie auf unserem WebPortal
MuPAD in Schule und Studium unter: http://schule.mupad.de bzw. http://studium.mupad.de.
2. Unsere Material Sammlung enthält Arbeitsblätter zu den Archimedische Körper. Dort wird die
Funktion plot::SurfaceSet ebenfalls eingesetzt.
________________________________________________________________________________