75 lines
2.8 KiB
Plaintext
75 lines
2.8 KiB
Plaintext
|
<!-- 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,
|
||
|
was jedoch nur für eine feste Zackenanzahl (hier: 5) möglich ist,
|
||
|
ohne die Architektur der Applikation zu ändern.
|
||
|
|
||
|
### 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.
|