Answer to Question 1
a) Der Monitor A'' zeigt die Farben im Chromatizitätsdiagramm kräftiger, da sein Gamut im orangen-rot Bereich weiter nach außen reicht als der von Monitor A'.

b) Im Chromatizitätsdiagramm können alle Chromazitätswerte innerhalb des Dreiecks A'B'C korrekt mit dem zu A' gehörigen Monitor gedruckt werden.

c) Um die Chromazitätswerte für t = (0.5, 0.3, 0.2) im XYZ-Farbraum zu berechnen, müssen wir zuerst die Farbwerte in den RGB-Raum transformieren. Dazu verwenden wir die inverse Luminanzfunktion und die PrimärFarbenwerte des Monitors (nicht gegeben). Anschließend bestimmen wir die Abstände von jeder RGB-Koordinate zum Weißenpunkt im RGB-Raum, was die Chromazitätswerte ergibt. Da diese Berechnung ohne konkrete PrimärFarbenwerte nicht direkt durchgeführt werden kann, können hier keine spezifischen Zahlenwerte angegeben werden.

d) Der (gekrümmte) Rand des Chromatizitätsdiagramms repräsentiert den gesamten möglichen Farbtonbereich, der mit dem jeweiligen Farbsystem erzeugt werden kann.

e) Die vollgesättigte Farbvalenz zur Farbe c wird durch Verbindung des Weißenpunkts w mit dem Punkt c im Chromatizitätsdiagramm bestimmt. Man zeichnet eine geradlinige Verbindung von w nach c und die Stelle, an der diese Linie den Chromatizitätsradius berührt, gibt die vollgesättigte Farbe für c an.





****************************************************************************************
****************************************************************************************




Answer to Question 2
a) Für jeden der Transportpfade (1) bis (4) und Whitted-Style Raytracing:

(1) Dieser Pfad entspricht einer direkten Beleuchtung von der Punktlichtquelle zum Boden und dann direkt zur Kamera. Er kann durch Whitted-Style Raytracing erzeugt werden, da es sich um eine einfache First-Bounce-Simulation handelt.

(2) Der Pfad (2) geht vom Punktlichtsource zum Glasblock, reflektiert an der Oberfläche des Blocks und dann zur Kamera. Er kann auch durch Whitted-Style Raytracing erzeugt werden, da es hier ebenfalls nur eine einzelne Reflexion betrifft.

(3) Der Pfad (3) geht vom Punktlichtsource zum Boden, wird reflektiert auf den Glasblock und von dort direkt zur Kamera. Auch dieser Pfad kann durch Whitted-Style Raytracing dargestellt werden, da es sich um eine Kombination aus Reflection + Direct Light betrifft.

(4) Der Pfad (4) geht vom Punktlichtsource zum Boden, wird reflektiert auf den Glasblock und von dort indirekt an die Wand reflektiert, bevor er zur Kamera gelangt. Dieser Pfad kann nicht direkt durch Whitted-Style Raytracing dargestellt werden, da es hier eine Spiegelung an der Wand gibt, was mehrere Bounces beinhaltet.

b) Skizze des resultierenden Bildes der Kamera:

Die Bildebene wird in vier Bereiche unterteilt, die den Transportpfaden (1) bis (4) entsprechen. Die Farben und Beschriftungen könnten wie folgt aussehen:

- Bereich für Pfad (1): Grün (Boden), beschriftet mit "Grüner Boden"
- Bereich für Pfad (2): Transparenter Schatten von Glasblock, beschriftet mit "Reflektiertes Licht vom Block"
- Bereich für Pfad (3): Rot (Wand), beschriftet mit "Reflektiertes Licht vom Boden"
- Bereich für Pfad (4): Weiß (Punktlichtquelle), beschriftet mit "Direktes Licht"

Die Strahlen (r_1) bis (r_4) zeigen die Positionen auf der Bildebene, an denen diese Farben sichtbar sind.





****************************************************************************************
****************************************************************************************




Answer to Question 3
a) In Abbildung (a) wird die Reflexionswelle dargestellt, in (b) die Diffusion oder Streuung, in (c) der GlanzEffekt und in (d) die Schattenwirkung.

b) Die Variation zwischen Abbildungen (c) und (d) entsteht durch den Glanzgradparameter des Phong-Beleuchtungsmodells. In Abbildung (c) ist der Glanzgrad niedriger, was zu einem fl\u00e4chigeren und weniger auff\u00f6lligen Effekt f\u00fcr die reflektierte Lichtintensit\u00e4t führt. Im Vergleich dazu hat Abbildung (d) einen h\u00f6heren Glanzgrad, was eine stärker konzentrierte und auffälligere Reflexion darstellt.

c) Wenn Gouraud Shading verwendet wird, wird das Beleuchtungsmodell einmal pro Triangle-Ecke ausgewertet und dann interpoliert, um die Farbe der einzelnen Pixel im Dreieck zu bestimmen. Daher wird das Modell in diesem Fall 3 Mal angewendet.

Im Falle von Phong Shading wird das Beleuchtungsmodell für jeden Pixel des rasterisierten Dreiecks unabhängig voneinander berechnet, was bedeutet, dass es f\u00fcr die 5 Pixel im Beispiel 5 Mal ausgewertet wird.

Die Unterschiede zwischen Gouraud und Phong Shading liegen darin, dass Gouraud Shading computergest\u00f6rt ist (weniger Rechenleistung erforderlich) aber eventuell mindesgenauere Ergebnisse liefert, da die Beleuchtungswerte nur an den Triangle-Ecken berechnet werden. Phong Shading bietet eine bessere Kontinuit\u00e4t in der Beleuchtung, was realistischere Schattierungen erzeugt, aber mehr Rechenleistung erfordert.





****************************************************************************************
****************************************************************************************




Answer to Question 4
a) Die Reihenfolge, in der die Hüllekörper traversiert werden, wäre: A1, B2, C3.

b) Bei Wiederverwendung der Hierarchie aus Abbildung 2 und den geänderten Geometrien würde die neue Hüllekörper-Hierarchie wie folgt aussehen:
- Zunächst wäre der Hüllekörper A vergrößerter, um den neuen Teil der Geometrie zu erfassen.
- Dann würde der Hüllekörper B2 erhalten bleiben, da er immer noch einen Teil der Geometrie enthält.
- Schließlich würde der Hüllekörper C3 kleiner werden, da er nur noch den kleinen rechten Teil des Objekts umschließt.

c) Vorteil von Wiederverwendung der Hierarchie aus Teilaufgabe b): Es wird Zeit und Ressourcen gespart, da keine vollständige Neuerstellung notwendig ist.
Nachteil von Wiederverwendung: Die Hierarchie könnte nicht optimal an die neuen Geometrieveränderungen angepasst sein, was zu ineffizienten Traversierungsprozessen führen kann.

d) Beispiele für Alternativen zu achsenparallelen Boxen als Hüllekörper:
1. Oktahedron-Hüllekörper: Vorteil: Bessere Approximation der Geometrie, insbesondere bei spitzwinkligen Formen; Nachteil: Komplexere Berechnungen und höhere Speicherbedürfnisse.
2. Kugel-Hüllekörper: Vorteil: Gute Abdeckung des Inneren des Objekts unabhängig von der Richtung; Nachteil: Größerer Overhead bei der Traversierung aufgrund der runden Form, die möglicherweise mehr Hüllekörper erfordert.





****************************************************************************************
****************************************************************************************




Answer to Question 5
a) Eine affine Transformation M, die das Objekt wie in der Abbildung "transformation_first.png" transformiert, kann gebildet werden, indem man zuerst die Matrix F anwendet, dann C und schließlich B. Das entspricht dem Produkt FCB.

b) Um das Objekt schrittweise durch die Matrizen F, C und B zu transformieren:

1. Anfangszustand: Das Objekt o ist in seiner ursprünglichen Form.
2. Transformation mit F: Das Objekt wird um 90° im Uhrzeigersinn gedreht (durch Drehung der Koordinatenachsen).
3. Transformation mit C: Das Objekt wird verdreht und verkleinert, wobei es einen neuen Mittelpunkt erhält.
4. Transformation mit B: Das Objekt wird verschoben, um den finalen Standort zu erreichen.

c) Wenn ein Objekt o mit der Matrix T = E · C · F transformiert wird, werden die Normalen nicht richtig transformiert. Eine affine Transformation wie T beeinflusst nur die Vektoren im dreidimensionalen Raum, aber nicht ihre Normalenvektoren. Die Normalen müssen orthogonal zur Fläche des Objekts bleiben, was bei einer allgemeinen affinen Transformation nicht automatisch der Fall ist.

Um Normalen korrekt zu transformieren, müssen wir sie durch eine orthogonale Projektion auf die Transformationsmatrix T' berechnen. Eine orthogonale Matrix R kann aus T' hergeleitet werden, indem man die Transposede ihrer Spurlosen Matrix (C = T' - 0.5 * (T' · T')) bildet und diese mit der Inversen von C multipliziert (R = C^(-1) · C^T). Die transformierten Normalen sind dann Rn, wobei n die ursprünglichen Normalen des Objekts sind.





****************************************************************************************
****************************************************************************************




Answer to Question 6
a) Zwei Alternativen zur bilinearen Interpolation bei Texturen, die aus der Vorlesung bekannt sind, sind trilineare Interpolation und quadratische Interpolation (beispielsweise bicubische Interpolation).

b) Bei der bilinären Interpolation werden die Werte wi,j interpoliert, indem Gewichte berechnet werden. Diese Gewichte hängen von den Koordinaten (x, y) ab, die im Intervall [0, 1] liegen. Die Gewichtung erfolgt wie folgt:
- Wenn x und y beide zwischen 0 und 1 liegen, sind die Gewichte für die vier Nachbarn (wi-1,j-1), (wi-1,j), (wi,j-1) und (wi,j) gleich: (1-x)(1-y), x(1-y), (1-x)y, xy.
- Wenn x oder y außerhalb des Intervalls liegt, werden die entsprechenden Nachbarn nicht berücksichtigt und die Gewichte für die verbleibenden Werte werden durch 1 minus den überschrittenen Koordinatenwert multipliziert.

c) Bei Mip-Mapping sollte die Auflösungsstufe idealerweise so gewählt werden, dass sie der Entfernung vom Betrachter zum Texturpunkt entspricht. Wenn dies nicht der Fall ist, können zwei Probleme auftreten:
1. Aliasing: Wenn die Mip-Level-Auflösung zu hoch ist im Vergleich zur Entfernung, kann es zu Überlagerungen von Texturen kommen, was ungewünschte Artefakte erzeugt.
2. Flickern: Wenn die Mip-Level-Auflösung zu niedrig ist, kann der Texturinhalt bei Änderungen der Entfernung schnell wechseln, wodurch ein flackern-Effekt entsteht.

d) In einer Mip-Map wird jede Stufe in halbierter Auflösung gespeichert, weil dies eine effiziente Methode darstellt, um die Texturinformationen für verschiedene Entfernungen abzudecken. Durch Halbierung der Auflösung bei jeder Stufe werden die benötigten Ressourcen reduziert und es wird ein ausreichend großer Abdeckungsbereich für den Betrachter geschaffen.

e) Da \u03bb_1 = 0.5 und \u03bb_2 = 0.4, liegen beide Koordinaten im Intervall [0, 1]. Dies bedeutet, dass die baryzentrischen Koordinaten für den Punkt x bezüglich der Eckpunkte des Dreiecks positiv sind. Eine Bedingung für einen Schnittpunkt eines Strahls mit dem Dreieck ist, dass die Summe der baryzentrischen Koordinaten gleich 1 ist (Summe von \u03bb_1, \u03bb_2 und \u03bb_3). Hier ist diese Bedingung erfüllt, da \u03bb_1 + \u03bb_2 = 0.5 + 0.4 = 0.9. Da die dritte baryzentrische Koordinate nicht explizit genannt wurde, kann angenommen werden, dass sie den Rest ergibt (also \u03bb_3 = 1 - (\u03bb_1 + \u03bb_2) = 0.1). Daher liegt der Strahl im Dreieck.

f) Der Punkt x' ist ein Punkt entlang der Linie zwischen v_2 und v_1, die durch den Faktor 1/2 näher an v_1 als an v_2 liegt. Die baryzentrischen Koordinaten \u03bb'_1, \u03bb'_2, \u03bb'_3 für x' können berechnet werden:
- \u03bb'_1 = \u03bb_1 + (1/2) * (\u03bb_2 - \u03bb_1) = 0.5 + (1/2) * (0.4 - 0.5) = 0.6
- \u03bb'_2 = \u03bb_2 - (1/2) * (\u03bb_2 - \u03bb_1) = 0.4 - (1/2) * (0.4 - 0.5) = 0.3
- Da die Summe der baryzentrischen Koordinaten gleich 1 sein muss, ergibt sich \u03bb'_3 = 1 - (\u03bb'_1 + \u03bb'_2) = 1 - (0.6 + 0.3) = 0.1

Die baryzentrischen Koordinaten für x' sind also \u03bb'_1 = 0.6, \u03bb'_2 = 0.3 und \u03bb'_3 = 0.1.





****************************************************************************************
****************************************************************************************




Answer to Question 7
a) Pipeline-Stufen und ihre Eigenschaften:
1. Vertex Shader: Arbeiten mit einzelnen Vertices (Eingabedaten), erzeugt transformierte Vertices (Ausgabedaten). Anzahl der Eingabeelemente = N, Anzahl der Ausgabeelemente = N.
2. Tessellation Control Shader: Arbeiten mit einem Patch (Eingabedaten), erzeugt mehrere Patches (Ausgabedaten). Anzahl der Eingabeelemente = 1, Anzahl der Ausgabeelemente = M < N.
3. Tessellation Evaluation Shader: Arbeiten mit den Patches aus dem vorherigen Schritt (Eingabedaten), erzeugt transformierte Vertices (Ausgabedaten). Anzahl der Eingabeelemente = M, Anzahl der Ausgabeelemente = M.
4. Geometry Shader: Arbeiten mit Primitives (Eingabedaten), erzeugt neue Primitives (Ausgabedaten). Anzahl der Eingabeelemente = 1 oder N, Anzahl der Ausgabeelemente = M < N.
5. Fragment Shader: Arbeiten mit jedem Pixel eines Triangle (Eingabedaten), erzeugt Farbinformationen pro Pixel (Ausgabedaten). Anzahl der Eingabeelemente = 1, Anzahl der Ausgabeelemente = 1.

b) Das Backface-Culling entscheidet, ob ein Dreieck sichtbar ist oder nicht, indem es prüft, in welche Richtung das Normalenvektor des Dreiecks zeigt. Dies erfordert die vollständige Transformation des Vertex durch den Vertex Shader und den Perspective Division im rasterisierenden Prozess. Bis zur Primitive Assembly-Stufe sind diese Transformationen nicht abgeschlossen, daher kann erst danach entschieden werden, ob ein Teil der Eingabevertices verworfen wird.

c) Im Geometry Shader können zwei Dreiecke pro Partikel erzeugt werden, indem man für jeden Vertex des Partikels einen weiteren Vertex generiert. Diese neuen Vertices bilden zusammen mit dem ursprünglichen Vertex die beiden Dreiecksseiten. Jedes Partikel würde also im GS zu einem Triangle Strip führen, der aus zwei Dreiecken besteht.

d) Eine alternative Möglichkeit ohne Geometry Shader wäre, im Vertex Buffer für jedes Rauchpartikel vier Vertices zu speichern: Zwei für jeden Dreiecksknoten. Dann werden diese direkt an den Rasterizer übergeben, der die beiden Dreiecke aus den vier Vertices erzeugt.

e) Ohne Blending kann man Bereiche einer Textur nicht darstellen, indem man sie einfach nicht zeichnet. Dazu muss man eine separate Textur oder einen separaten Texture-Channel verwenden, der angibt, ob ein Bereich gezeichnet werden soll oder nicht. Im Fragment Shader wird dann überprüft, ob das Attribut für den unerwünschten Bereich 0 ist und entsprechend kein Farbverzerrung durch Blending ausgeführt wird.





****************************************************************************************
****************************************************************************************




Answer to Question 8
a) Blending findet an der Stelle in der OpenGL-Pipeline statt, nachdem das Fragment Shader program ausgeführt wurde und bevor die resultierenden Farbwerte im Framebuffer gespeichert werden.

b) 
1. F_s = (0.5, 0.5, 0.5, 0.8) aus dem Fragment Shader, F_d = (1.0, 0.0, 0.0, 1.0) aus dem Framebuffer
   - Konfiguration: 1 (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

2. F_s = (0.5, 0.5, 0.5, 0.8) aus dem Fragment Shader, F_d = (0.0, 0.0, 0.0, 0.0) im Framebuffer
   - Konfiguration: 3 (GL_ONE, GL_ONE_MINUS_SRC_ALPHA)

c) Beim Alpha-Blending von semitransparenten Objekten ist eine Sortierung notwendig, weil der Tiefentest nur die Transparenz an der Grenze zwischen zwei Oberflächen berücksichtigt, nicht jedoch die relative Position der semitransparenten Flächen im Szenegraphen. Wenn ein transparentes Objekt vor einem anderen liegt, aber beide einen ähnlichen Alpha-Wert haben, kann das hintere Objekt durch das vordere verdeckt werden, obwohl es理应在前方objekt的前面可见。 

Um die Objekte zu sortieren, werden sie üblicherweise nach ihrer Entfernung vom Kamerapunkt (oder einem anderen Bezugspunkt) geordnet. Das objekt am nächsten zum Kamerapunkt wird zuerst gezeichnet, gefolgt von den weiter entfernten Objekten. Auf diese Weise werden semitransparente Flächen korrekt übereinander gelegt und die richtige Transparenzwirkung entsteht.





****************************************************************************************
****************************************************************************************




Answer to Question 9
a) Diese Einschränkung bei Rasterisierung notwendig ist, weil die Rasterisierungs-Methode in OpenGL eine Flächentiefenbestimmung durchführt. Dabei wird pro Pixel entschieden, ob es von einem Gitterpunkt des Dreiecksnetzwerks gesehen wird oder nicht. Bei einer realistischeren Betrachtung mit mehreren Lichtbrechungen an verschiedenen Stellen innerhalb des Objekts würde dies zu einer komplexeren Berechnung führen, die pro Pixel möglicherweise mehrere Intersektionspunkte erfordern würde. Diese zusätzliche Komplexität wäre für eine Rasterisierung unpraktisch und ineffizient.

b) Um das reflektierende und transparente Glasobjekt mit Normal Mapping und einer Cube-Environment Map zu rendern, benötigen Sie im Wesentlichen vier Shader:

1. Ein Vertex Shader: DieserShader berechnet den transformierten Vertex-Punkt im Raum.
2. Ein Fragment (Pixel) Shader: Hier werden die Farben pro Pixel bestimmt, inklusive der Transparenz, Reflektion und Normal Mapping.
3. Ein Normal Mapping Shader-Teil: Dieser Teil des Fragment Shaders berechnet die modifizierte Normalenvektor basierend auf dem Normalenmap-Texture-Input.
4. Ein Environment Mapping Shader-Teil: Dieser Teil des Fragment Shaders berechnet das reflektierte Licht anhand der Cube-Environment Map.

c) Für die folgenden Aufgaben und Funktionsaufrufe:

1. Berechnung der transformierten Normalenvektors aus einer Normalenmap: Dies würde im Fragment Shader erfolgen, da es pro Pixel geschieht und die Information über den Normalenmap-Texture-Input benötigt wird.

2. Bestimmung des reflektierten Lichts anhand der Cube-Environment Map: Auch dies würde im Fragment Shader stattfinden, da hier die Kameraposition, der Normalenvektor und die Environment Map nötig sind, um den reflektierten Farbwert zu berechnen.

In Figuren/shader_first.png könnte man eine schematische Darstellung von zwei Shadern zeigen: Einen Vertex Shader (links) mit einigen mathematischen Operationen für die Transformation und einen Fragment Shader (rechts), der die Berechnungen für Transparenz, Reflektion und Normal Mapping enthält. Der Fragment Shader wäre hier deutlich komplexer als der Vertex Shader, da er pro Pixel arbeitet und mehrere Texturen einbezieht.





****************************************************************************************
****************************************************************************************




Answer to Question 10
a) Die Funktion "intersectDF" könnte wie folgt vervollständigt werden:

```cpp
bool intersectDF(vec3 origin, vec3 rayDir, out float t, out vec3 surfacePos) {
    float bestDistance = INFINITY;
    bool hit = false;

    for (int i = 0; i < maxSteps; ++i) {
        float distanceToSurface = DF(origin + rayDir * i);
        if (distanceToSurface < bestDistance && distanceToSurface > 0.0f) {
            bestDistance = distanceToSurface;
            surfacePos = origin + rayDir * bestDistance;
            t = bestDistance;
            hit = true;
        }
    }

    return hit;
}
```

Die Funktion durchläuft den Strahl in Schritten und prüft, ob er das Distanzfeld berührt. Wenn ein Schnittpunkt gefunden wird (d.h. die Entfernung zwischen dem aktuellen Punkt und der Oberfläche ist kleiner als die bisher beste Entfernung), wird dieser als neuer Schnittpunkt gespeichert und der Vorgang beendet.

b) Die Korrektur des Schnittpunkts ist notwendig, da das Glasobjekt eine Brechigkeit (η = 1.3) hat, was bedeutet, dass Strahlen innerhalb des Objekts langsamer laufen als im umgebenden Medium mit einer Brechigkeit von 1.0. Die Berechnung der relativen Brechzahl (n2 / n1) ermöglicht es, die Geschwindigkeit des Lichts im Material zu berücksichtigen.

Die if(DF(o))-Bedingung testet, ob der Strahl das innere Distanzfeld des Objekts durchläuft. Wenn dies der Fall ist, muss eine Refraktion stattfinden. Diese Bedingung ist notwendig, da wir nur refraktieren möchten, wenn der Strahl tatsächlich durch das Glasobjekt geht und nicht einfach an seiner Außenseite abgelenkt wird.

c) Gloss-Mapping ist ein Verfahren, um den Glanzeffekt von Oberflächen zu simulieren. Es speichert in einer Textur die Glanzzahl für verschiedene Punkte auf der Oberfläche. Bei der gewählten Schattierungstechnik ist es einfach hinzuzufügen, da man nur eine zusätzliche Textur als Eingabe an den Shader übergeben und die Glanzzahl abrufen muss, um die Ausbeute des Lichts zu beeinflussen.

d) Um Dispersionseffekte bei der Refraktion hinzuzufügen, könnte man für jedes Farbkanal (rot, grün, blau) eine separate Brechzahl verwenden. Diese Brechzahlen würden basierend auf dem Wellenlängenbereich des Lichts berechnet werden. Der Berechnungsaufwand im Shader würde erhöht, da für jede Farbe eine separate Refraktionsberechnung erforderlich wäre.





****************************************************************************************
****************************************************************************************




Answer to Question 11
a) Jede BVH B' mit T_K'(x), wobei K' \u2264 K konstruiert wird, ist eine korrekt-funktionierende BVH für die Szene, weil sie weiterhin alle Quadern im Raum abdeckt, die durch die Funktion T_K(x) definiert sind. Eine solche BVH gruppiert die Quadern effizient in Achsenparallelen Hüllekörpern (AABB), was den Raytracing-Prozess beschleunigt. Der Nachteil einer solchen BVH B' im Vergleich zu einer BVH B mit K' < K ist, dass sie möglicherweise mehr Overhead hat, da die AABBs größer sein können und somit mehr Prüfungen bei der Intersektionsprüfung erforderlich sind.

b) Um die Rauschfunktion n(x) minimal oft auszuwerten, kann man Raymarching verwenden. Dabei wird ein Strahl r(i) = o + id durch das Hohenfeld geschickt und die Funktion T_K(r_x(i), r_y(i)) nur an den Schritten i überprüft, bei denen sich der Z-Koordinate des Strahls ändert (r_z(i)). Wenn r_z(i) \u2264 T_K(r_x(i), r_y(i)), ist der Schnittpunkt gefunden. Ein Pseudocode könnte wie folgt aussehen:

```
for i = 1 to N:
    if r_z(i) <= T_K(r_x(i), r_y(i)):
        return (r_x(i), r_y(i), r_z(i))
```

c) Eine Rauschfunktion sollte unvorhersehbar und zufällig aussehen, um interessante Strukturen zu erzeugen. Die Funktion n(x) = sin(x) ist periodisch und hat regelmäßige Wellenformen, was nicht zufällig aussieht. Daher würde diese Wahl die gewünschte Unvorhersehbarkeit und Komplexität einer Rauschfunktion nicht erfüllen.

d) Die Ableitungsregeln für das L-System zur Erzeugung der Kochschen Schneeflocke mit V = {F, +, -}, \u03b1 = 60\u25e6 und Startwort F - - F - - F sind:

```
X -> F++FX++
Y -> FF
```

Die Regel X wird durch die Startwort initialisiert und die Regel Y dient lediglich als Hilfsregel. Durch wiederholte Anwendung der Regel X auf dem Startwort entstehen die iterierten Formen der Schneeflocke, wobei '+' für eine Drehung um 60\u25e6 und 'F' für den Vektorverlängerungs-Befehl steht.





****************************************************************************************
****************************************************************************************




Answer to Question 12
a) Um den Punkt F(0.5) der dritten Grad-Bézier-Kurve zu finden, müssen wir die Kurve in zwei Teile unterteilen, wobei jeder Teil eine Bézier-Kurve vom Grad 2 darstellt. Wir betrachten u = 0.5 als Trennpunkt zwischen den beiden Teilkurven. Die Kontrollpunkte der ersten Teilkurve sind b0=(0,0) und b1=(12,0), während die Kontrollpunkte der zweiten Teilkurve b1=(12,0) und b2=(0,6) sind.

Zunächst zeichnen wir die Kontrollpunkte der beiden Teilkurven. Die erste Teilkurve hat den Kontrollpunkt b2=(0,6), der auf der y-Achse liegt, und die zweite Teilkurve hat den Kontrolpunkt b3=(8,10) im rechten Drittel des Diagramms.

Dann verbinden wir diese Kontrollpunkte mit den entsprechenden Endpunkten (b0 und b1 für die erste Teilkurve, b1 und b2 für die zweite Teilkurve), um die Bézier-Polygonlinien zu erstellen. Diese Linien sind die interpolierten Linien zwischen den Kontrollpunkten.

Als nächstes verbinden wir den gemeinsamen Kontrollpunkt b1=(12,0) mit dem Punkt F(0.5), der auf der halben Strecke zwischen den Endpunkten liegt (also bei x=6). Dieser Punkt ist die Summe von 0.5 mal der erste Teilkurve und 0.5 mal der zweiten Teilkurve.

b) Eine affine Abbildung \u03d5 besteht aus einer Translation, einer Skalierung und einer Drehung. Um eine Bézier-Kurve F unter Verwendung der affinen Invarianz zu transformieren, müssen wir die Kontrollpunkte Füße bewegen. Die Transformation lautet für einen Punkt P=(x, y) wie folgt:
\[ \u03d5(P) = T + S \cdot R(P - C), \]
wobei T der Vektor für die Translation ist, S ein Skalierungsfaktor, R eine Drehmatrix mit dem Winkel \(\theta\), und C der Mittelpunkt der Drehung.

Wir müssen also jede Kontrollpunktfüße F von F nach dieser Formel transformieren:
\[ F' = T + S \cdot R(F - C). \]

c) Um zu zeigen, dass die abgebildete Kurve nicht der kubischen Bézier-Kurve G(u) entspricht, können wir die Variationsreduzierung verwenden. Diese Methode reduziert eine kubische Bézier-Kurve auf zwei konsequente quadratic Bézier-Kurven.

Die Kontrollpunkte der kubischen Bézier-Kurve G(u) sind gegeben durch g0=(1, 2), g1=(3, 4), g2=(5, 6), und g3=(7, 8). Wir betrachten den Trennpunkt u = 0.5.

Die Kontrollpunkte der beiden Teilkurven sind:
- Erste Teilkurve: h0=g0=(1, 2) und h1=g1=(3, 4)
- Zweite Teilkurve: i0=h1=(3, 4) und i1=g2=(5, 6)

Wir berechnen den Punkt G(0.5) als die Summe von 0.5 mal der ersten Teilkurve und 0.5 mal der zweiten Teilkurve:
\[ G(0.5) = 0.5 \cdot H(0.5) + 0.5 \cdot I(0.5), \]
wobei H(u) die Bézier-Kurve mit Kontrollpunkten h0 und h1 ist, und I(u) die Bézier-Kurve mit Kontrollpunkten i0 und i1.

Wir finden G(0.5) durch die Berechnung von H(0.5) und I(0.5), was uns einen Punkt im Diagramm gibt, der nicht mit dem gegebenen Punkt übereinstimmt. Dies zeigt, dass die abgebildete Kurve nicht identisch zur kubischen Bézier-Kurve G(u) ist.

Insgesamt würde ich die Antworten auf den Fragen zeichnerisch darstellen, indem ich die Kontrollpunkte und interpolierten Linien der Teilkurven in den gegebenen Diagrammen einzeichne.





****************************************************************************************
****************************************************************************************




