|
Prof.
Urban
|
![]() |
![]() |
||
Wenn man den Punkten einer Ebene die Koordinaten x und y gibt, so stellt die Menge aller (x/y) die gesamte Ebene dar. Erlegen wir diesen Koordinaten eine Bedingung wie etwa x+y=4 auf, dann werden nicht mehr alle Punkte der Ebene dargestellt, sonder nur mehr diejenigen, die diese Gleichung erfüllen. Welche sind das? Klarer Fall - das ist eine Gerade.
Anders ausgedrückt: wir erhalten eine Iso-Linie, da alle Punkte auf ihr die konstante (=iso) Summe 4 besitzen.
Müssen es Gerade sein? Was sagst Du zu x2+y2=4 ? Das ergibt einen Kreis, oder allgemeiner eine Iso-Kurve in der Ebene.
Geht es auch spannender? Wie wärs mit x2-y2=4 ? Wir gelangen zu einer Hyperbel! Oder wir nehmen x2+y=4 . Eine Parabel!
Nun kann man Forschungen anstellen: Wenn die Hochzahl 2 so viel bewirken kann, was wäre dann mit x2+y3=4 ? Welche Kurve ergibt das? Die Antwort kann entweder eine Kurvendiskussion liefern (wenn Du das im Matheunterricht gelernt hast) oder ein schlichtes Ausprobieren. Meine Empfehlung wären dazu die Programm Derive oder TI-Interactive aus dem Unterricht. Versuche die Darstellung der Lemniskate (x2+y2)2-2(x2-y2)=0 und der Strophoide (1-x)y2-(1+x)x2=0.
Allgemein gesprochen: Bastle Dir irgendeine Funktion aus x und y, nenne sie f(x,y). Die Gleichung f(x,y) = const. beschreibt dann eine Iso-Kurve in der Ebene. Einige Mathematiker bringen die Konstante lieber nach links in die Funktion hinein, und bezeichnen als Iso-Kurven die Lösungen von f(x,y)=0.
Ergibt jede Funktion etwas Interessantes? Leider nein. Zwar stimmt es, dass das Auferlegen einer Bedingung in der Ebene die Zahl der Freiheitsgrade um 1 vermindert, das Ergebnis also irgendeine Art Kurve ist, doch kann diese auch langweilig sein.
Beispiele:
Anmerkung:
Niemand verbietet es Dir, andere Mathematische Funktionen in Deine
Iso-Funktion aufzunehmen. Auch sin(x)*cos(y)-2x-7=0
stellt somit eine Iso-Kurve dar. Beachte, dass Wurzeln, Logarithmen,
Winkelfunktionen Deine Kurve zerteilen können, wie etwa sin(x)=0.5
unendlich viele einpunktige Lösungen besitzt.
Hier haben wir die drei Koordinaten x, y und z zur Verfügung und damit eine riesige Menge von Möglichkeiten. Aus dem Mathematikunterricht kennst Du die Ebenengleichung 3x-4y+2z-7=0, oder die Kugelgleichung x2+y2+z2=4.
Wie können wir derartige Iso-Flächen f(x,y,z)=const in POV-Ray berechnen lassen? Zum Glück ist das recht einfach, weil unser Raytracer diesen Typ breits als vorgefertigtes Objekt zur Verfügung stellt. Allerdings sind einige Dinge zu beachten:
Beginnen wir damit, die gewöhnliche Einheitskugel als Isosurface zu berechnen Die bestimmende Gleichung ist f(x,y,z)=x2+y2+z2-1=0.
Der erste Versuch ist
isosurface {
function { x*x + y*y +z*z - 1 } // die bestimmende Funktion
contained_by { box { -1.2, 1.2 } } // wichtig: der gültige Rechenbereich
pigment { rgb <0.8,0.1,0.2> }
finish { ambient 0.3 phong 0.8 phong_size 10 }
}
Das Ergebnis sieht aber so aus:

Was ist hier schiefgelaufen? Hat POV-Ray ungenau gerechnet? Es gibt einen Parameter accuracy, der standardmäßig auf 0.001 gestellt ist und die Rechengenauigkeit bestimmt. Versuchen wir es mit 0.00001:

Das ist ja noch schlechter als zuvor. Das Problem muss also woanders liegen. Wie arbeitet ein Raytracer: er schickt einen Sehstrahl zum Objekt und versucht den Schnittpunkt zu ermitteln. Ist er nicht gefunden, wandert der Tracer auf dem Sehstrahl kleine Stücke nach vor und zurück, um den Schnitt zu ermitteln. Und dabei kann es zu Fehlern kommen, wenn diese Schrittweiten schlecht, d.h. zu groß, gewählt sind. Wir müssen dem Raytracer einen Wert zukommen lassen, der die maximale 'Steilheit' oder Änderungsrate auf unserer Fläche beschreibt. Unter Mathematikern ist dies als Gradient bekannt. Je höher dieser gesetzt ist, desto feiner - und langsamer - arbeitet POV-Ray. Dieser Wert ist oft rechnerisch bestimmbar, für uns genügt 'Ausprobieren'. (Für die Kugel wär es leicht: x2 differenziert gibt 2x und das hat in der begrenzenden Box den Maximalwert 2 mal 1.2, also genügt der Gradient 2.4). Das vollständige Skript:
global_settings { assumed_gamma 1.0}
camera {
location <0,0,-10>
look_at 0
right x*image_width/image_height
angle 20
}
light_source { <5,5,-5> color rgb 1 }
sky_sphere {
pigment {
gradient y
color_map {
[0.0 color rgb <0.7,0.7,1.0>]
[1.0 color blue 0.5]
}
}
}
isosurface {
function { x*x + y*y +z*z - 1 }
contained_by { box { -1.2, 1.2 } }
accuracy 0.001 // Standardwertt
max_gradient 3 // maximaler Gradient
pigment { rgb <0.8,0.1,0.2> }
finish { ambient 0.3 phong 0.8 phong_size 10 }
}
Und sein Ergebnis ist endlich eine wunderschöne Kugel

Das
Schlüsselwort open
erlaubt es, die Flächen nicht als gefüllte
Körper, sondern wirklich als 'Flächen' darzustellen.
Ein Experiment mit einem Paraboloid (alle Dir bekannten
Rotationskörper lassen sich übrigens als Isoflächen
darstellen) x*x + z*z - y = 0
ohne und mit open:


-5(x2y+x2z+y2x+y2z+z2y+z2x)+2(xy+xz+yz) = 0
camera { location <2, 2, -10> look_at <0, 0, 0> angle 16}
sky_sphere {
pigment {
function { abs(y) }
color_map {
[0.0 rgb <.3,.3,.8>]
[1.0 color rgb 1]
}
}
}
light_source {<30,200,-30> colour rgb 1}
light_source {<-30,200,-100> colour rgb 0.5}
#declare F=function{
-5*(x*x*y + x*x*z + y*y*x + y*y*z + z*z*y + z*z*x)
+2*(x*y + x*z + y*z)
}
isosurface {
function { F(x,y,z) }
max_gradient 12
contained_by { sphere {0,1.0} }
open
pigment { rgb .9 }
finish { phong 0.5 phong_size 10 }
no_shadow
}

8(x2-Φ4y2)(y2-Φ4z2)(z2-Φ4x2)(x4+y4+z4-2x2y2-2x2z2-2y2z2)
+
+ (3+5Φ)(x2+y2+z2-w2)2[x2+y2+z2-(2-Φ)w2]2w2
=
0
wobei Φ das goldenen Verhältnis darstellt. Der Parameter w ist ein Parameter, der im folgenden Beispiel als 1 gewählt ist. Auch der contained_by Eintrag ist äußerst wichtig - er bestimmt, auf welche Weise diese (tatsächlich viel größere) Figur 'beschnitten' wird, um das gewünschte Ergebnis zu liefern (denk an den Graphen von x3: er ist nur um den Ursprung herum interessant, außerhalb ist er langweilig). Passe Kamera und Begrenzung an, um 'mehr' zu sehen (mehr Details oder mehr räumliche Ausgehnung).
global_settings { assumed_gamma 1.0 }
camera {
location <0, 0, -10>
look_at <0, 0, 0>
angle 20
}
sky_sphere { pigment {
function{abs(y)}
color_map { [0.0 rgb <.3,.3,.8>] [1.0 color rgb 1] }
}
}
light_source {<30,200,-30> colour rgb 1}
light_source {<-30,200,-100> colour rgb 0.5}
light_source {<0,20,-100> colour rgb 0.5}
#declare GR=1.6180339887; // Goldener Schnitt
#declare GR2=GR*GR;
#declare GR4=GR2*GR2;
#declare BarthDecic = function(x,y,z,w) {
8*(x*x - GR4*y*y)*(y*y - GR4*z*z)*(z*z - GR4*x*x)
*(x*x*x*x + y*y*y*y + z*z*z*z - 2*x*x*y*y - 2*x*x*z*z - 2*y*y*z*z)
+(3+5*GR)*pow((x*x + y*y + z*z - w*w),2)
*pow((x*x + y*y +z*z - (2 - GR)*w*w),2)*w*w
}
isosurface {
function { BarthDecic(x,y,z,1.0) }
max_gradient 370
contained_by { sphere {0,1.2} }
open
pigment { rgb .9 }
finish { phong 0.5 phong_size 10 }
}

Das Finden von Funktionen mit interessantem Aussehen als Isoflächen ist nicht leicht. Auch daran, dass die 'hübschen' Ergebnisse mit dem Namen des sie entdeckt habenden Mathematikers verknüpft sind, deutet ja darauf hin.