Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:blc:math:povray:lektion5 [2017/06/01 12:35] – [Aufgabe 6: Kochschneeflocke] Ivo Blöchliger | lehrkraefte:blc:math:povray:lektion5 [2017/06/02 09:07] (current) – [Aufgabe 6: Kochschneeflocke] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ===== Lektion vom 2. Juni 2017 ===== | ||
| + | ==== Aufgabe 0 ==== | ||
| + | Rendern Sie folgenden Code und studieren Sie diesen. Stellen Sie danach Fragen, wenn Sie etwas nicht verstehen. | ||
| + | <code povray funktionen.pov> | ||
| + | // Kamera | ||
| + | camera { | ||
| + | sky < | ||
| + | right < | ||
| + | location < | ||
| + | look_at <0, 0, 0> // Blickrichtung (erscheint im Bildmittelpunkt) | ||
| + | angle 35 // Oeffnungswinkel der Kamera | ||
| + | } | ||
| + | |||
| + | // Lichtquellen | ||
| + | light_source { | ||
| + | < | ||
| + | color rgb < | ||
| + | } | ||
| + | light_source { | ||
| + | < | ||
| + | color rgb < | ||
| + | } | ||
| + | |||
| + | // 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 " | ||
| + | rotate 90*x | ||
| + | rotate 90*z | ||
| + | translate 2.3*y | ||
| + | } | ||
| + | text { ttf " | ||
| + | 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)/ | ||
| + | #while (starty< | ||
| + | sphere { < | ||
| + | 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}$ | ||
| + | * Gleichzeitig beide Funktionen $f(x)=\sqrt{1-(1-|x|)^2}$ und $g(x)=-3\sqrt{1-\sqrt{\frac{|x|}{2}}}$. | ||
| + | |||
| + | ==== Aufgabe 2: " | ||
| + | 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:// | ||
| + | |||
| + | |||
| + | Alternative mit weniger Rechenfehler: | ||
| + | <code povray> | ||
| + | #declare starty=-2; | ||
| + | #declare endy=2; | ||
| + | #declare n=50; | ||
| + | #declare dy=(endy-starty)/ | ||
| + | #declare i=0; | ||
| + | #while (i< | ||
| + | #declare yy=starty+i*dy; | ||
| + | sphere { <0,yy, meinf(yy)>, | ||
| + | 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: | ||
| + | <code povray fxy.pov> | ||
| + | // Kamera | ||
| + | camera { | ||
| + | sky < | ||
| + | right < | ||
| + | location < | ||
| + | look_at <0, 0, 0> // Blickrichtung (erscheint im Bildmittelpunkt) | ||
| + | angle 35 // Oeffnungswinkel der Kamera | ||
| + | } | ||
| + | |||
| + | // Lichtquellen | ||
| + | light_source { | ||
| + | < | ||
| + | color rgb < | ||
| + | } | ||
| + | light_source { | ||
| + | < | ||
| + | color rgb < | ||
| + | } | ||
| + | |||
| + | // xy-Ebene | ||
| + | plane {z,0 | ||
| + | pigment { checker color rgb 0.2 color rgb 0.9 } | ||
| + | } | ||
| + | |||
| + | #macro hoehe(xx, | ||
| + | 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)/ | ||
| + | #declare dy=(endy-starty)/ | ||
| + | |||
| + | #declare xx = startx; | ||
| + | #while (xx< | ||
| + | #declare yy = starty; | ||
| + | #while (yy< | ||
| + | sphere { < | ||
| + | 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$ | ||
| + | * $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)). | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Die Funktion ist wie folgt aufgebaut: | ||
| + | |||
| + | | ||
| + | wenn r=0: | ||
| + | | ||
| + | sonst | ||
| + | 3 Zwischenpunkte P1, P2, P3 aus A,B berechnen | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | 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: | ||
| + | <code povray> | ||
| + | #macro kochKurve(a, | ||
| + | #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>; | ||
| + | #local p1 = ??; // TODO: Aus a und vv den Punkt p1 berechnen. | ||
| + | #local p2 = ??; // TODO: p2 berechnen | ||
| + | #local p3 = ??; // TODO: p3 berechnen | ||
| + | kochKurve(a, | ||
| + | // Hier die weiteren Segmente zeichnen | ||
| + | #end | ||
| + | #end | ||
| + | |||
| + | // Zeichnen der Kurve: | ||
| + | // kochKurve liefert einzelne Objekte. Die werden in einer union zusammengefasst, | ||
| + | // alle eine gemeinsame Farbe und evtl. Transformationen erhalten können. | ||
| + | union { | ||
| + | kochKurve(< | ||
| + | pigment { color rgb x } | ||
| + | } | ||
| + | |||
| + | </ | ||