drawMath

Mathematische Grundlagen und Algorithmen
zur zweidimensionalen Darstellung dreidimensionaler Kristallgitter
als Kugeln mit Verbindungslinien und Koordinationspolyeder


Lutz Tautenhahn © 1993-1999


Inhalt

1. Transformation eines schiefwinkligen nichtnormierten Koordinatensystems in ein orthonormales Koordinatensystem

2. Transformation orthonormaler Koordinatensysteme

3. Berechnung eines zweidimensionalen Abbildes von Kugeln im dreidimensionalen Raum

4. Berechnung der Anfangs- und Endkoordinaten von Verbindungslinien

5. Drehung der Betrachterposition um die Blickposition

6. Berechnung des Abstandes eines Punktes von einer Ebene

7. Schattierung einer Kugel

8. Darstellung von Kalotten

9. Darstellung von Koordinationspolyedern

10. Berechnung der Orientierung eines gedrehten Koordinatensystems


Symbole und Abkürzungen

sklein und fett geschriebene Buchstaben sind Richtungsvektoren
siKomponente eines Vektors in i-Richtung (i = x, y, z)
Bgroß geschriebene Buchstaben sind Punkte
iBi-Koordinate des Punktes B (i = x, y, z)
BNVektor, der vom Punkt B zum Punkt N zeigt
|s|Betrag eines Vektors
geg.:es werden gegebene Größen gekennzeichnet
Def.:es werden (Hilfs-)Größen definiert
NB:Nebenbedingung, es muß gelten


1. Transformation eines schiefwinkligen nichtnormierten Koordinatensystems in ein orthonormales Koordinatensystem

Es gebe voneinander linear unabhängige Vektoren a , b und c (zum Beispiel Gittergrundvektoren), die ein schiefwinkliges nichtnormiertes Koordinatensystem im dreidimensionalen Raum bilden. Es soll angenommen werden, daß bezüglich eines orthonormalen Koordinatensystems ( ex , ey , ez ) der Vektor a als Vielfaches von ex , der Vektor b als Linearkombination von ex und ey und der Vektor c als Linearkombination von ex , ey und ez darstellbar seien. Die Winkel Fiab zwischen a und b , Fiac zwischen a und c und Fibc zwischen b und c seien bekannt.
Gesucht wird eine Transformation, durch die man einen Vektor OP", der im Koordinatensystem ( a , b , c ) gegeben ist, im Koordinatensystem ( ex , ey , ez ) darstellen kann. Der Ursprung beider Koordinatensysteme sei gleich.
geg.:|a| , |b| , |c| , Fiab , Fiac , Fibc
Def.:ax = |a|Def.:xa = 1 / ax
bx = |b| · cos ( Fiab )ya = - bx / ( ax · by )
by = |b| · sin ( Fiab )za = ( bx · cy - by · cx ) / ( ax · by · cz )
cx = |c| · cos ( Fiac )yb = 1 / by
cy = ( |b| · |c| · cos ( Fibc ) - bx · cx ) / byzb = - cy / ( by · cz )
cz = sqrt ( |c|2 - cx2 - cy2 )zc = 1 / cz

Für die Transformation

OP" ( p"a · a , p"b · b , p"c · c ) <==> OP ( px · ex , py · ey , pz · ez )

erhält man: px = ax · p"a + bx · p"b + cx · p"cbzw.: p"a = xa · px + ya · py + za · pz
py = by · p"b + cy · p"c p"b = yb · py + zb · pz
pz = cz · p"c p"c = zc · pz


2. Transformation orthonormaler Koordinatensysteme

Gegeben seien zwei orthonormale Koordinatensysteme, die den selben Ursprung besitzen. Die Einheitsvektoren e'x , e'y und e'z lassen sich jeweils als Linearkombinationen der Einheitsvektoren ex , ey und ez darstellen:

 · ( ex , ey , ez )T = ( e'x , e'y , e'z )T

Die Matrixkoeffizienten aij ( i , j = 1...3 ) seien bekannt. Gegeben seien die Komponenten ( px , py , pz ) eines Ortsvektors OP im Koordinatensystem ( ex , ey , ez ). Gesucht sind die Komponenten ( p'x , p'y , p'z ), die dieser Ortsvektor als OP' im Koordinatensystem ( e'x , e'y , e'z ) hat:
( ex , ey , ez )T · ( px , py , pz )T = ( e'x , e'y , e'z )T · ( p'x , p'y , p'z )T
Man erhält: ( ex , ey , ez )T · ( px , py , pz )T = ( Â · ( ex , ey , ez )T ) · ( p'x , p'y , p'z )T
( ex , ey , ez )T · ( px , py , pz )T = ( ex , ey , ez )T · ( ÂT · ( p'x , p'y , p'z )T)
Daraus folgt: ( px , py , pz )T = ÂT · ( p'x , p'y , p'z )T
( p'x , p'y , p'z )T = ( ÂT )-1 · ( px , py , pz )T


3. Berechnung eines zweidimensionalen Abbildes von Kugeln im dreidimensionalen Raum

Gegeben seien n Kugeln im dreidimensionalen Raum von denen jeweils die Position ( xi , yi , zi ), der Radius ri und der Typ ti (entspricht der Farbe der Kugel) bekannt seien ( i = 1...n ).
Gesucht wird ein zweidimensionales Abbild, das ein Betrachter, der sich
  1. in unendlicher Entfernung in Richtung b = ( bx , by , bz ) befindet, sehen würde (parallelperspektivische Darstellung).
  2. in der Betrachterposition B ( xB , yB , zB ) befindet, sehen würde, wenn das zweidimensionale Abbild eine Projektion auf eine ebene Fläche ist (zentralperspektivische Darstellung).
  3. in der Betrachterposition B ( xB , yB , zB ) befindet, sehen würde, wenn das zweidimensionale Abbild eine Projektion auf eine Kugeloberfläche um B ist (sphärische Darstellung).
Durch einen anzugebenden senkrechten Vektor s soll bei dem zweidimensionalen Abbild die vertikale Richtung definiert werden, d. h. ein gedachtes Abbild von s soll nach oben zeigen. Als Blickposition N ( xN , yN , zN ), d. h. die Position, die in der Mitte des zweidimensionalen Abbildes erscheinen soll, wird das arithmetische Mittel aller Kugelpositionen angenommen. Der Vektor von der Betrachterposition B zur Blickposition N soll in Normalenrichtung zur Fläche des zweidimensionalen Abbildes zeigen. Zur einheitlichen mathematischen Beschreibung wird auch für die parallelperspektivische Darstellung eine Betrachterposition definiert.
geg.:Kugelpositionen Pi ( xi , yi , zi ), Kugelradien ri , ( i = 1 ... n )
Def.:Blickposition N ( xN , yN , zN ) = ( ( x1 + ... + xn ) / n , ( y1 + ... + yn ) / n , ( z1 + ... + zn ) / n )
Def.:Maximalabstand Kugelposition - Blickposition Rmax = Max { |P1N| , ... , |PnN| }
geg.:Betrachterrichtung b ( bx , by , bz ) (nur bei 1.)
Def.:f = 10 · Rmax / |b| (nur bei 1.)
Def.:( xB , yB , zB ) = ( xN + f · bx , yN + f · by , zN + f · bz ) (nur bei 1.)
geg.:Betrachterposition B ( xB , yB , zB ) (nur bei 2. und 3.)
NB:BN > Rmax ! (nur bei 2. und 3.) B muß außerhalb des betrachteten Gebietes liegen!
Def.:a = BN / |BN| normierter Vektor Betrachterposition - Blickposition
geg.:senkrechter Vektor s ( sx , sy , sz )
NB:|s| = 1 ! senkrechter Vektor normiert
NB:|s · a| < 1 ! s muß eine Komponente senkrecht zu a haben!
1. Schritt:Transformation ( ex , ey , ez ) ==> ( e'x , e'y , e'z )
so daß a ( ax , ay , az ) ==> a' ( 0 , 0 , -1 )
und s ( sx , sy , sz ) ==> s' ( 0 , s'y , s'z )
daraus folgt ex = ( a × s ) / | a × s |
ey = ( s - a · ( a · s ) ) / | s - a · ( a · s ) |
ez = - a
Daraus lassen sich die Koeffizienten aij ( i , j = 1 ... 3 ) der Matrix  berechnen, so daß gilt:

( e'x , e'y , e'z )T = Â · ( ex , ey , ez )T

2. Schritt: Transponieren und Invertieren der Matrix Â

3. Schritt: Berechnung der Kugelpositionen in den neuen Koordinaten P'i ( i = 1...n ):

( x'i , y'i , z'i )T = ( Â T )-1 · ( xi - xB , yi - yB , zi - zB )T

4. Schritt: Berechnung der Bild(schirm)koordinaten entsprechend dem Darstellungstyp (1, 2 oder 3):

Es wird angenommen, daß ein quadratischer Bildschirmbereich mit Xmax - Xmin = Ymax - Ymin zum Zeichnen zur Verfügung steht. Dabei ist X die Pixelnummer in horizontaler Richtung und nach rechts steigend, Y ist die Pixelnummer in vertikaler Richtung und nach unten steigend.
geg.:Xmin , Xmax , Ymin , Ymax
NB:Xmax - Xmin = Ymax - Ymin
Def.:Xm = ( Xmin + Xmax ) / 2
Ym = ( Ymin + Ymax ) / 2
Def.:D = ( Xmax - Xmin ) / 2 = ( Ymax - Ymin ) / 2

Darstellungstyp 1 (parallelperspektivische Darstellung):

Xi = Xm + x'i · D / Rmax
Yi = Ym - y'i · D / Rmax
Ri = ri · D / Rmax

Darstellungstyp 2 (zentralperspektivische Darstellung):

Def.: R'max = Rmax · |BN| / sqrt ( |BN|2 - Rmax2 )

Xi = Xm + x'i · D / R'max · |BN| / ( - z'i )
Yi = Ym - y'i · D / R'max · |BN| / ( - z'i )
Ri = ri · D / R'max · |BN| / ( - z'i )

Darstellungstyp 3 (sphärische Darstellung):

Def.: Fimax = arcsin ( Rmax / |BN| ) (halber Blickwinkel)

Xi = Xm + D / Fimax · arcsin ( xi / sqrt ( x'i + z'i ) )
Yi = Ym - D / Fimax · arcsin ( yi / sqrt ( y'i + z'i ) )
Ri = D / Fimax · arcsin ( ri / |BPi| )

Die n Kugeln sind in der Reihenfolge zu zeichnen, daß die von der Betrachterposition am weitesten entfernte Kugel zuerst dargestellt wird und die am nächsten liegende Kugel zuletzt, wodurch die Überlappungen korrekt dargestellt werden. Um bei einem Programm die Rechenzeit und damit die Zeit, die für die Darstellung benötigt wird, minimal zu halten, sollten Terme, die für die Berechnung der Bildschirmkoordinaten aller Kugeln gleich sind, nur einmal berechnet werden (z.B. (ÂT)-1 , Xm , Ym , D/Rmax , D/Rmax · |BN| und D/Fimax ). Es ist zu beachten, daß, wenn die Anzahl der Kugeln groß ist, der Hauptanteil der Rechenzeit zum Ordnen der Kugeln entsprechend ihrer Entfernung zur Betrachterposition benötigt wird. Es sollte deswegen ein schneller Sortieralgorithmus (z.B. Mergesort oder Quicksort) verwendet werden, wobei nicht die Objekte selbst, sondern nur ihre Adressen sortiert werden sollten (indirektes Sortieren). Das Invertieren der Matrix kann man z.B. mit dem als "Gauß-Algorithmus mit teilweiser Pivotsuche" bekannten Verfahren realisieren, auf die Pivotisierung darf dabei nicht verzichtet werden.


4. Berechnung der Anfangs- und Endkoordinaten von Verbindungslinien

Eine Verbindungslinie zwischen zwei Kugeln ist eine Strecke von der Oberfläche der einen Kugel zur Oberfläche der anderen Kugel, wobei die Strecke auf einer Geraden verläuft, die durch die Mittelpunkte beider Kugeln geht. Für zwei Kugeln, von denen die Mittelpunktskoordinaten und die Radien bezüglich eines orthonomalen Koordinatensystems bekannt seien, sollen die Anfangs- und Endkoordinaten der Verbindungslinie berechnet werden:
geg.:Pi ( xi , yi , zi ) Position der Kugel i
ri Radius der Kugel i
Pj ( xj , yj , zj ) Position der Kugel j
rj Radius der Kugel j

Für die Anfangs- und Endkoordinaten Si und Sj der Verbindungslinie zwischen den Kugeln erhält man:
OSi = OPi + ri · PiPj / |PiPj|
und OSj = OPj - rj · PiPj / |PiPj|
Für die Berechnung der Anfangs- und Endkoordinaten der Verbindungslinien beim zweidimensionalen Abbild kann der unter 3. dargestellte Formalismus verwendet werden, wobei die Gleichungen für den entsprechenden Darstellungstyp verwendet werden müssen. Die Verbindungslinien können auch bei der sphärischen Darstellung in guter Näherung als gerade Linien dargestellt werden. Bei der Darstellung ist darauf zu achten, daß die Kugeln von hinten nach vorn gezeichnet werden und nachdem je eine Kugel gezeichnet wurde, sind die Verbindungslinien dieser Kugel zu Kugeln, die weiter vorn sind, zu zeichnen. Es ist zu empfehlen, Verbindungslinien zu anderen Kugeln zu zeichnen, wenn diese entweder bis zu einem bestimmten Maximalabstand entfernt sind oder wenn sie bis zu einem bestimmten Vielfachen des Abstandes der nächstliegenden Kugel entfernt sind.


5. Drehung der Betrachterposition um die Blickposition

Für ein zyklisch arbeitendes Programm, bei dem sich die n Kugeln im Abbild um eine Achse drehen, die durch die Blickposition verläft, ist es einfacher, die Kugelkoordinaten beizubehalten und statt dessen die Betrachterposition um die Blickposition zu drehen. Es wird im folgenden der normierte Vektor a' berechnet, der einer Drehung des normierten Vektors a um einen senkrechten normierten Vektor s entspricht:
geg.: a = BN / | BN | normierter Vektor Betrachterposition - Blickposition
s ( |s| = 1 ) senkrechter Vektor
Fi ( |Fi| < 90 Grad ) Drehwinkel
Es gilt: a = a||s + a|_s
a' = a'||s + a'|_s
a'||s = a||s
a'|_s = cos ( Fi ) · a|_s + sin ( Fi ) · ( s × a )

Man erhät als neuen normierten Vektor a' :

a' = ( a · s ) · s + cos ( Fi ) · ( a - ( a · s ) · s ) + sin ( Fi ) · ( s × a )


6. Berechnung des Abstandes eines Punktes von einer Ebene

Aus den n Kugeln sollen diejenigen ausgesucht werden, die höchstens einen gegebenen Maximalabstand von einer bestimmten Ebene E entfernt sind. Von der Ebene sind entweder drei Punkte gegeben oder ein Punkt und ein Normalenvektor.
geg.:M Mittelpunkt einer Kugel
P1 Ebenenpunkt 1
P2 Ebenenpunkt 2 (Fall 1)
P3 Ebenenpunkt 3 (Fall 1)
n ( |n| = 1 ) Ebenennormale (Fall 2)
Def.:n = ( P1P2 × P1P3 ) / |P1P2 × P1P3| (nur für Fall 1)

Für den Abstand d des Kugelmittelpunktes M von der Ebene E erhält man:

d = n · P1M


7. Schattierung einer Kugel

Zur besseren räumlichen Verdeutlichung ist es zweckmäßig, die Kugeln schattiert darzustellen. Es soll angenommen werden, daß das von einer Kugel abgegebene Licht aus einem reflektierten und einem diffusen Anteil besteht. Der reflektierte Anteil Iref sei durch eine gedachte punktförmige Lichtquelle in unendlicher Entfernung hervorgerufen, das diffuse Licht Idif durch die Eigenstrahlung der Kugel bzw. durch isotropes Hintergrundlicht. Es soll angenommen werden, daß die von einem Punkt der Oberfläche der Kugel abgegebene Lichtintensität in alle Richtungen gleich ist, unabhängig von der Richtung des einfallenden Lichtes. Des weiteren soll die gegenseitige Beeinflussung der Kugeln durch Schattenwurf oder Mehrfachreflexion vernachlässigt werden. Als hellster Punkt S ( Symmetriepunkt ) einer Kugel erscheint dann die Stelle, an der die Oberflächennormale in Richtung Lichtquelle zeigt. Es soll angenommen werden, daß der Symmetriepunkt stets auf der dem Betrachter zugewandten Seite liegt. Die abgegebene Lichtintensität des Symmetriepunktes sei normiert durch:

IS = ISref + Idif = 1

Die abgegebene Lichtintensität unterscheidet sich für verschiedene Oberflächenpunkte einer Kugel nur im reflektierten Anteil. Für einen beliebigen Oberflächenpunkt P der Kugel mit dem Mittelpunkt M und dem Symmetriepunkt S erhält man dann:

IP = IPref + Idif mit
IPref = Max { ISref · cos ( Fi ) , 0 }

wobei Fi der Winkel zwischen den Vektoren MS und MP ist. Über die Beziehungen

sin ( Fi /2 ) = 1/2 · |SP| / |MS| ,
cos2 ( Fi /2 ) = 1 - sin2 ( Fi /2 ) und
cos ( Fi ) = 2 · cos2 ( Fi /2 ) - 1 erhält man
cos ( Fi ) = 1 - 1/2 · |SP|2 / |MS|2.

Die Berechnung der Helligkeit kann für alle darzustellenden Oberflächenpunkte einer Kugel direkt im Bildschirmkoordinatensystem erfolgen:

geg.:M ( XM , YM ) Mittelpunkt der Kugel
r Radius der Kugel (im Bildschirmkoordinatensystem)
Idif ( 0 < Idif < 1 ) diffuser Lichtanteil
S ( XS , YS ) Symmetriepunkt der Kugel
Def.:ZS = sqrt ( r2 - ( XS - XM )2 - ( YS - YM )2 )
geg.:P ( XP , YP ) Oberflächenpunkt der Kugel
Def.:ZP = sqrt ( r2 - ( XP - XM )2 - ( YP - YM )2 )

Für die darzustellende Helligkeit des Oberflächenpunktes P der Kugel erhält man somit:

IP = ( 1 - Idif ) · Max {1 - 1/2 · ( ( XS - XP )2 + ( YS - YP )2 + ( ZS - ZP )2 ) / r2 , 0 } + Idif

Beim Zeichnen ist darauf zu achten, daß Terme, die für alle darzustellenden Oberflächenpunkte gleich sind, nur einmal berechnet werden ( z.B. ZS und r2 ), um somit die Rechenzeit und damit die Zeit, die für die Darstellung benötigt wird, minimal zu halten. Dem berechnete Helligkeitswert im Bereich zwischen 0 und 1 ist dann jeweils ein entsprechender Pixelfarbwert zuzuordnen.


8. Darstellung von Kalotten

Wenn der Abstand der Mittelpunkte zweier Kugeln kleiner ist, als die Summe ihrer Radien, durchdringen sich ihre Oberflächen gegenseitig, die Schnittfigur ist ein Kreis. OP1 sei der Vektor zum Mittelpunkt der ersten Kugel mit dem Radius r1 , OP2 sei der Vektor zum Mittelpunkt der zweiten Kugel mit dem Radius r2 . Für jeden Punkt PK auf dem Kreis gilt dann:

P1PK2 = r12 und

P2PK2 = r22 = ( P1PK - P1P2 )2 = P1PK2 - 2 · P1P2 · P1PK + P1P22

Daraus erhält man:

P1P2 · P1PK = ( r12 - r22 + P1P22 ) / 2

Für den Mittelpunkt M des Kreises gilt:

P1M = ( P1PK · P1P2 / |P1P2| ) · ( P1P2 / |P1P2| )

Durch Einsetzen erhält man:

P1M = 1/2 · ( r12 - r22 + P1P22 ) · P1P2 / |P1P2| 2

Für die weitere Berechnung ist es zweckmäßig, das Bildschirmkoordinatensystem zu verwenden. Die aktuell darzustellende Kugel sei Kugel 1. Es soll angenommen werden, daß der Mittelpunkt P1 der Kugel 1 im Ursprung des Bildschirmkoordinatensystems liegt. Für die Z-Koordinate Z = ZK eines Punkt P, der auf dem sichtbaren Teil der Oberfläche der Kugel 1 liegt, gilt dann:

ZK = sqrt ( r12 - X2 - Y2 )

Für einen Punkt P, der auf der Ebene liegt, die durch den Schnittkreis der beiden Kugeln geht, gilt:

MP · OM = 0

( X - XM ) · XM + ( Y - YM ) · YM + ( Z - ZM ) · ZM = 0

Daraus erhält man für die Z-Koordinate Z = ZE des Ebenen-Punktes P:

ZE = ( XM2 + YM2 + ZM2 - X · XM - Y · YM ) / ZM

Mit Hilfe der Z-Komponenten läßt sich für jeden Bildschirmpunkt ermitteln, ob die Kugel oder die Kreisebene näher an der Betrachterposition liegt. Nach entsprechenden Fallunterscheidungen läßt sich somit für jeden Bildschirmpunkt ermitteln, ob er zu Kugel 1, Kugel 2, zur Schnittfläche oder zum Hintergrund gehört. Terme, die für alle Bildschirmpunkte einer Kugel gleich sind, sollten auch hier nur einmal berechnet werden (z.B. XM2 + YM2 + ZM2 ).


9. Darstellung von Koordinationspolyedern

Gegeben seien die (distinkten) Eckpunkte P1 ... Pn (n > 2) eines konvexen Polyeders, gesucht sind alle Facetten f1 ... fm des Polyeders. Diese Facetten sind konvexe Polygone und sollen als Listen von Punkten ermittelt werden, so daß zwei benachbarte Punkte in der Liste stets einer Kante der Facette entsprechen.
Bei Koordinationspolyedern haben alle Eckpunkte in der Regel einen konstanten Abstand zum Mittelpunkt M und können folgendermaßen aus einer Menge von Punkten ermittelt werden:
  • Ermittlung des Minimalabstandes r = Min {|MP1|, |MP2|, ...} eines Punktes vom Mittelpunkt
  • alle Punkte i mit |MPi| <= c · r sind Eckpunkte des Polyeders, c ist geringfügig größer als 1 und gibt die maximal zulässige Verzerrung des Koordinationspolyeders an.
Die Facetten des Polyeders können iterativ ermittelt werden, d. h. die Facetten des konvexen Polyeders mit den Eckpunkten P1 ... Pj werden ermittelt durch Hinzufügen des Punktes Pj zu den Facetten des konvexen Polyeders mit den Eckpunkten P1 ... Pj-1:
  • Erzeuge (entartetes) Polyeder mit den 3 Eckpunkten P1, P2 und P3 und den 2 Facetten f1 = {P1, P2, P3} und f2 = {P1, P3, P2} mit den 2 Normalenvektoren n1 = - n2.
  • Für j = 4 bis n wiederhole:
    • Markiere alle Kanten, die nicht im neuen Polyeder enthalten sind:
      Jede Kante gehört zu genau 2 Facetten und wenn sie nicht im neuen Polyeder enthalten ist, gilt für die 2 Facetten fk und fl, die diese Kante gemeinsam haben:
      nk · PkPj > - EPSILON und nl · PlPj > - EPSILON
      Pk und Pl sind beliebige Punkte der Facetten fk bzw. fl. Die Markierung der Kanten benötigt nur ein Bit und kann somit i. d. R. ohne zusätzlichen Speicherplatzbedarf realisiert werden (z. B. Vorzeichen bei integer-Index-Listen der Eckpunkte der Facetten verwenden).
    • Füge den Punkt Pj zu allen Facetten hinzu, wenn er in der Ebene der jeweiligen Facette liegt:
      Ein Punkt Pj liegt genau dann in der Ebene der Facette fk, wenn gilt:
      |nk · PkPj| < EPSILON
      Der Punkt Pj ist in die Liste der Punkte der Facette entweder vor oder nach dem Punkt , zu dem er den geringsten Abstand hat, einzufügen. Von den beiden Varianten ist diejenige zu wählen, bei der sich für den Winkel am Punkt Pj (bzw. das Skalarprodukt der normierten Vektoren) der größere Wert ergibt, andernfalls erhält man kein konvexes Polygon.
    • Ersetze alle anderen Facetten, die nicht im neuen Polyeder enthalten sind, durch Dreiecks-Facetten:
      Eine andere Facette fk ist genau dann nicht im neuen Polyeder enthalten, wenn gilt:
      nk · PkPj > 0
      Es ist für jede unmarkierte Kante dieser Facette eine neue Facette zu erzeugen, die die zwei Punkte der Kante und den Punkt Pj (in gleicher Reihenfolge) enthält, die ursprüngliche Facette ist zu löschen.
    • Setze alle Markierungen zurück
Die Facetten sind in der Reihenfolge zu zeichnen, daß die von der Betrachterposition am weitesten entfernte Facette zuerst als Polygon dargestellt wird und die am nächsten liegende Facette zuletzt, wodurch die Überlappungen korrekt dargestellt werden. Facetten, bei denen das Skalarprodukt aus Normalenvektor und Vektor zur Betrachterposition kleiner als Null ist, brauchen nicht dargestellt zu werden, da diese bei geschlossenen Polyedern stets verdeckt sind (es sei denn die Polyeder sind teilweise transparent). Für die Berechnung der Bildschirm-Koordinaten der Eckpunkte ist der unter 3. dargestellte Formalismus zu verwenden.


10. Berechnung der Orientierung eines gedrehten Koordinatensystems

Gegeben seien zwei orthonormale Koordinatensysteme im 3-dimensionalen Raum, die den selben Ursprung besitzen. Gesucht ist der Einheitsvektor r in Richtung der Rotationsachse und der Winkel Fi, so daß das erste Koordinatensystem bei einer Drehung um r mit dem Winkel Fi in das zweite Koordinatensystem überführt wird. Die Koordinatensysteme seien definiert durch je zwei senkrecht aufeinander stehende Einheitsvektoren e1 und e2 bzw. e'1 und e'2 (der jeweils dritte Einheitsvektor ergibt sich daraus zwangsläufig). Es können die folgenden Fälle unterschieden werden:
  1. e1 = e'1, e2 = e'2: r = e1, Fi = 0
  2. e1 = e'1, e2 = - e'2: r = e1, Fi = 180°
  3. e1 = e'1, |e2 × e'2| > 0: r = (e2 × e'2) / |e2 × e'2|, Fi = arccos (e2 · e'2)
  4. e1 = - e'1, e2 = e'2: r = e2, Fi = 180°
  5. e1 = - e'1, e2 = - e'2: r = e1 × e2, Fi = 180°
  6. e1 = - e'1, |e2 × e'2| > 0: r = (e2 + e'2) / |e2 + e'2|, Fi = 180°
  7. |e1 × e'1| > 0, e2 = e'2: r = (e1 × e'1) / |e1 × e'1|, Fi = arccos (e1 · e'1)
  8. |e1 × e'1| > 0, e2 = - e'2: r = (e1 + e'1) / |e1 + e'1|, Fi = 180°
  9. |e1 × e'1| > 0, |e2 × e'2| > 0 (allgemeiner Fall):
    s = (((e1 + e'1) × (e1 × e'1)) × ((e2 + e'2) × (e2 × e'2)))
    wenn (|s × e1| > |s × e2|) dann u = s × e1, u' = s × e'1
    sonst u = s × e2, u' = s × e'2
    wenn ((u × u') · s > 0 ) dann r = s / |s| sonst r = - s / |s|, Fi = arccos ((u / |u|) · (u' / |u'|))
Die Richtung der Rotationsachse für den allgemeinen Fall erhält man aus folgender Überlegung: Es sei R ein beliebiger Punkt der Rotationsachse und P' der Punkt, den man durch Drehung des Punktes P um die Rotationsachse erhält, dann gilt stets |RP| = |RP'|, d.h. die Abstände sind gleich. Daraus folgt für die Rotationsachse bzgl. der Vektoren e1 und e'1 (die beide den gleichen Betrag haben), daß diese Achse in der Ebene liegt, die durch die Vektoren (e1 + e'1) und (e1 × e'1) aufgespannt wird, analoges gilt für die Rotationsachse bzgl. der Vektoren e2 und e'2. Die Rotatiosachse selbst ist daher die Schnittgerade dieser beiden Ebenen und läßt sich durch die obige Gleichung berechnen. Die hier dargestellten Gleichungen sind zur Konvertierung von 3D-Welt-Scenen verschiedener Formate geeignet, insbesondere zur Umwandlung vom POVRay-Format in das VRML-Format. Bei Umwandlung in entgegesetzter Richtung (VRML zu POVRay) kann die unter Punkt 5 angegebene Gleichung verwendet werden.
Werbung - Advertisement: