Table of Contents

Lektion vom 2. Juni 2017

Aufgabe 0

Rendern Sie folgenden Code und studieren Sie diesen. Stellen Sie danach Fragen, wenn Sie etwas nicht verstehen.

funktionen.pov
// 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<endy) 
  sphere { <0,starty, meinf(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:

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<n)    // i ist eine ganze Zahl, darum keine Rechenfehler
  #declare yy=starty+i*dy; 
  sphere { <0,yy, meinf(yy)>, 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:

fxy.pov
// 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<endx)
  #declare yy = starty;
  #while (yy<endy) 
    sphere { <xx,yy,hoehe(xx,yy)>, 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.

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:

 
 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 }
}