<!-- vim: set ft=markdown: -->
<!-- LTeX: language=de-DE -->
<!-- SPDX-License-Identifier: LGPL-3.0-or-later -->
# Praxisaufgabe 2 Einführung in die Computergrafik
## Team
* Simon Bruder, Matrikelnummer: 5075324
## Bearbeitete Zusatzaufgaben
* Rechteck-Werkzeug (`rectangle_tool.cpp`)
* Kreisrasterisierer (`bresenham_circle_tool.cpp`)
* Rasterisierer für Sternform (`star_tool.cpp`)
* Sweepline-Algorithmus (`sweep_line_tool.cpp`)
## Hinweise
### Projektaufbau
Die vorgegebene Ordnerstruktur wurde beibehalten.
Es wurde jedoch die `CMakeLists.txt`-Datei in das Wurzelverzeichnis verschoben,
um einen üblichen Aufbau des Projektes zu erhalten,
und es wurden die nicht benötigten Verzeichnisse (`build`, `data`, `dependencies`, `src_solution`) entfernt,
um einen Stand zu erhalten, der tauglich für Versionskontrolle ist.
Das Projekt kann (abweichend von der Ausgangskonfiguration)
mit folgenden (für CMake-Projekte übliche) Befehlen gebaut werden:
```bash
# in `u02`
mkdir -p build
cd build
cmake ..
make -j$(nproc)
```
Für Tests der Implementation wurde [Catch2](https://github.com/catchorg/Catch2) eingebunden,
was jedoch optional ist und bei Nichtvorhandensein lediglich eine Nachricht beim Aufruf von CMake ausgibt,
welche aber keinen Fehler darstellt.
Zu einer Auslagerung von grundlegenden Funktionalitäten,
die nicht einem bestimmten Werkzeug zuzuordnen sind,
wurde die Hilfsdatei `util.cpp` (und der zugehörige Header `util.h`) angelegt,
welche in CMake eingebunden ist.
### Sternrasterisierer
Der Sternrasterisierer ermöglicht theoretisch
die Rasterisierung von Sternen mit beliebigen Zackenanzahlen
(wobei ein hartes Limit von mindestens 2 Zacken besteht,
jedoch erst ab 3 eine Art Stern vorliegt).
In dem Beispielprogramm kann jedoch aus Komplexitätsgründen nur aus bestimmten Zackenanzahlen gewählt werden,
was jedoch per Kontextmenü möglich ist und damit der Aufgabenstellung entspricht.
Darüber hinaus wurde rudimentär eine Vorschau der Sternform hinzugefügt.
Da die vorgegebene Architektur keine Spezialisierungen der Formen eines Tools erlaubt,
und C++ (anders als bspw. Rust) keine Tuple/Struct enums zulässt,
wurden hier nur die über die Benutzerschnittstelle verfügbaren Zackenanzahlen fest implementiert.
### Sweepline-Algorithmus
Der Sweepline-Algorithmus, der im Programm aufrufbar ist,
hat für ein Beispiel-Dreieck 3 Eckpunkte fest im Code definiert.
Er ist jedoch allgemein ausgelegt und kann mit drei beliebigen Punkten aufgerufen werden,
die ein valides Dreieck bilden.
Dafür wurde `tool_base` so modifiziert,
dass es Werkzeugen möglich ist,
eine `draw`-Methode mit keinem (für die fest definierten Eckpunkte)
oder drei Punkten (für beliebige Dreiecke)
anzubieten.
Damit das Werkzeug kompatibel mit der Architektur des Hauptprogramms ist,
bietet es jedoch zusätzlich die `draw`-Methode mit zwei Punkten an,
welche jedoch die Punkte ignoriert und die `draw`-Methode ohne Punkte aufruft.