This repository has been archived on 2024-01-28. You can view files and clone it, but cannot push or open issues or pull requests.
ecg-prog-filtered/u02
2023-05-16 16:49:23 +02:00
..
include u02: Implement star tool 2023-05-16 16:49:22 +02:00
src u02/tests: Fix inverted logic in comment 2023-05-16 16:49:22 +02:00
readme.txt u02: Add readme 2023-05-16 16:49:23 +02:00

<!-- 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.