===== Lektion vom 2. Juni 2017 =====
==== Aufgabe 0 ====
Rendern Sie folgenden Code und studieren Sie diesen. Stellen Sie danach Fragen, wenn Sie etwas nicht verstehen.
// Kamera
camera {
sky <0,0,1> // Vektor, der festlegt, wo oben ist.
right <-4/3,0,0> // Bildverhaeltnis 4:3, plus Spiegelung für rechtsdrehendes System
location <10,0,0> // Position der Kamera
look_at <0, 0, 0> // Blickrichtung (erscheint im Bildmittelpunkt)
angle 35 // Oeffnungswinkel der Kamera
}
// Lichtquellen
light_source {
<60,-20,80> // Position des Lichts
color rgb <1,1,1> // Farbe des Lichts, als rot-gruen-blau Vektor (Komponenten 0 bis 1)
}
light_source {
<30,100,30> // Position des Lichts
color rgb <1,1,1> // Farbe des Lichts, als rot-gruen-blau Vektor (Komponenten 0 bis 1)
}
// yz-Ebene
plane {x,0
pigment { checker color rgb 0.2 color rgb 0.9 }
}
// y,z-Achse
union {
cylinder { -2*y, 2*y, 0.05 }
cylinder { -2*z, 2*z, 0.05 }
cone {2*y, 0.1, 2.3*y, 0 }
cone {2*z, 0.1, 2.3*z, 0 }
text { ttf "timrom.ttf" "y" 0.1, <0,0,0>
rotate 90*x
rotate 90*z
translate 2.3*y
}
text { ttf "timrom.ttf" "z" 0.1, <0,0,0>
rotate 90*x
rotate 90*z
translate 1.8*z+0.2*y
}
pigment { color rgb z }
finish { phong 0.95 }
}
// Berechnet den Funktionswert an der Stelle xx (x ist schon definiert)
#macro meinf(xx)
xx*xx-2 // Wert der Funktion
#end
#declare starty=-2;
#declare endy=2;
#declare n=100;
#declare dy=(endy-starty)/n;
#while (starty, 0.02
pigment { color rgb x }
}
#declare starty=starty+dy;
#end
==== Aufgabe 1 ====
Die Funktion im oberen Code ist $f(x)=x^2-2$. Ändern Sie die Funktion auf folgende Funktionen ab:
* $f(x) = -\frac{1}{2}x^2+1$
* $f(x) = \sin(x)$ //Die Funktion sin ist in POV-Ray definiert (Argument in Radiant).//
* $f(x) = |x|$ // Die Betragsfunktion in POV-Ray ist abs(...) (absolute value).//
* $f(x) = \sqrt{x}$ // Was müssen Sie anpassen? Die Wurzelfunktion in POV-Ray heisst sqrt(...).//
* Gleichzeitig beide Funktionen $f(x)=\sqrt{1-(1-|x|)^2}$ und $g(x)=-3\sqrt{1-\sqrt{\frac{|x|}{2}}}$. // Definieren Sie ein neues #macro dafür.//
==== Aufgabe 2: "Linien" statt "Punkte" ====
Verbinden Sie jeweils zwei benachbarte Kugeln mit einem Zylinder mit gleichem Radius. So entsteht eine durchgehende Linie.
Geben Sie die Datei auf SharePoint ab: https://sharepoint.ksbg.ch (-> Klassen -> 2lW -> Abgabe -> dort Ihren Ordner öffnen -> POV-Ray Datei entweder hineinziehen, oder mit hochladen, durchsuchen auswählen).
Alternative mit weniger Rechenfehler:
#declare starty=-2;
#declare endy=2;
#declare n=50;
#declare dy=(endy-starty)/n;
#declare i=0;
#while (i, 0.04
pigment { color rgb x }
}
#declare i=i+1;
#end
==== Aufgabe 3: $z=f(x,y)$ ====
Eine Funktion kann auch mehr als eine Eingabe haben. In dieser Aufgabe betrachten wir eine Art Landschaft, wobei die Höhe $z$ aus den $x$- und $y$-Koordinaten berechnet wird. Im folgenden Code wird die Funktion $f(x)=\frac{1}{2}\left(x^2+y^2\right)$ abgebildet:
// Kamera
camera {
sky <0,0,1> // Vektor, der festlegt, wo oben ist.
right <-4/3,0,0> // Bildverhaeltnis 4:3, plus Spiegelung für rechtsdrehendes System
location <5,2,5> // Position der Kamera
look_at <0, 0, 0> // Blickrichtung (erscheint im Bildmittelpunkt)
angle 35 // Oeffnungswinkel der Kamera
}
// Lichtquellen
light_source {
<60,-20,80> // Position des Lichts
color rgb <1,1,1> // Farbe des Lichts, als rot-gruen-blau Vektor (Komponenten 0 bis 1)
}
light_source {
<30,100,30> // Position des Lichts
color rgb <1,1,1> // Farbe des Lichts, als rot-gruen-blau Vektor (Komponenten 0 bis 1)
}
// xy-Ebene
plane {z,0
pigment { checker color rgb 0.2 color rgb 0.9 }
}
#macro hoehe(xx,yy)
0.5*(xx*xx+yy*yy)
#end
#declare startx = -1;
#declare endx = 1;
#declare starty=-1;
#declare endy=1;
#declare n=20;
#declare dx=(endx-startx)/n;
#declare dy=(endy-starty)/n;
#declare xx = startx;
#while (xx, 0.05
pigment { color rgb x }
}
#declare yy=yy+dy;
#end
#declare xx=xx+dx;
#end
Rendern und studieren Sie den Code. Stellen Sie Fragen, wenn Sie etwas nicht verstehen.
==== Aufgabe 4 ====
Ändern Sie die Funktion hoehe ab (und passen Sie evtl. den Bereich und die Kamera an), z.B.
* $f(x,y) = \sin(x)+\sin(y)+2$
* $f(x,y) = \cos\left(\sqrt{x^2+y^2}\right)+1$
* $f(x,y) = 2^{-\sqrt{x^2+y^2}}\cos\left(\sqrt{x^2+y^2}\right)+1$ //Hinweis: Potenz $a^b$ in POV-Ray: pow(a,b)//
* $f(x,y) = \cos(x)\cdot \cos(y)+1$
==== Aufgabe 5 ====
Fügen Sie zwischen benachbarten Kugeln Zylinder mit dem selben Radius ein.
==== Aufgabe 6: Kochschneeflocke ====
**Studieren** Sie folgenden Text:
Funktionen können beliebig viele Eingaben verarbeiten und beliebige Ausgaben produzieren. Funktionen können sich sogar selbst wieder zur Berechnung des Resultats gebrauchen.
Wir werden eine Funktion (#macro) **koch** definieren. Als Eingabe benötigt die Funktion 3 Dinge: Startpunkt $A$ und Endpunkt $B$ der Strecke und die Angabe, wieviel mal die Strecke noch unterteilt werden soll (d.h. die Anzahl Rekursionen (Selbstaufrufe)).
{{ :lehrkraefte:blc:math:povray:koch.png?direct |}}
Die Funktion ist wie folgt aufgebaut:
Funktion koch(A, B, r)
wenn r=0:
Strecke AB zeichnen
sonst
3 Zwischenpunkte P1, P2, P3 aus A,B berechnen
koch(A$, P1, r-1) // Teilstück mit einer Rekursion weniger zeichnen
koch(P1, P2, r-1)
koch(P2, P3, r-1)
koch(P3, B, r-1)
ende wenn
ende Funktion koch
Dazu definieren wir den Vektor $\vec v = \vec{AB}$ und den dazu rechtwinkligen Vektor $\vec u$. Kopieren Sie folgendes Code-Skelett:
#macro kochKurve(a, b, rekursionen)
#if (rekursionen=0)
// TODO: Hier die Strecke zeichen, z.B. mit einer Kugel mit Zentrum a und einem Zylinder von a nach b
// Nur die Objekte ohne Farbe definieren.
#else
#local vv = ??; // TODO: hier den Vektor ab berechnen
#local uu = <-vv.y, vv.x, 0>; // Rechwinkliger Vektor (Annahme, Punkte a,b mit gleicher z-Koordinate)
#local p1 = ??; // TODO: Aus a und vv den Punkt p1 berechnen.
#local p2 = ??; // TODO: p2 berechnen
#local p3 = ??; // TODO: p3 berechnen
kochKurve(a, p1, rekursionen-1)
// Hier die weiteren Segmente zeichnen
#end
#end
// Zeichnen der Kurve:
// kochKurve liefert einzelne Objekte. Die werden in einer union zusammengefasst, damit
// alle eine gemeinsame Farbe und evtl. Transformationen erhalten können.
union {
kochKurve(<0,0, 0>, <0,1,0>, 1) // 1 Rekursion zum Testen, dann auf 2,3,4 bis maximal 6 erhöhen
pigment { color rgb x }
}