TU-Programmieren_2/exercise4/main.ipynb
2025-04-09 10:22:44 +02:00

257 lines
8.9 KiB
Plaintext

{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Aufgabe 1: Ein eigenes kleines C++-Programm (*coordinate rotation*) (1 Punkt)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Erstellen Sie in [`task1.main.cpp`](task1.main.cpp) ein lauffähiges Ein-Dateien-Programm das folgende Struktur aufweist:\n",
"\n",
"- Einbinden benötigter Header-Dateien aus der Standardbibliothek, z.B.:\n",
"\t```cpp\n",
"\t#include <array> // std::array\n",
"\t#include <cmath> // std::sin, std::cos\n",
"\t#include <iostream> // std::cout, std::endl\n",
"\t#include <numbers> // std::numbers::pi\n",
"\t...\n",
"\t```\n",
"- Definition/Implementierung einer eigenen Funktion in einem eignene Namensraum, z.B.:\n",
"\t```cpp\n",
"\tnamespace task1 {\n",
"\n",
"\tusing Coord = std::array<double, 2>;\n",
"\n",
"\tCoord rotate_counter_clockwise(Coord coord, double angle) {\n",
"\t\t...\n",
"\t}\n",
"\t``` \n",
"- Definition/Implementierung einer `main`-Funktion, die Ihre selbst geschriebene Funktion verwendet und die berechneten Ergebnisse in der Konsole ausgibt, z.B.:\n",
"\t```cpp\n",
"\tint main(){\n",
"\t ...\n",
"\t auto [xrot, yrot] = rotate_counter_clockwise(...)\t\n",
"\t std::cout << xrot << \" \" << yrot << std::endl;\n",
"\t return 0;\n",
"\t}\n",
"\t``` \n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"- Eine genaue Beschreibung und Anforderungen finden Sie in [`task1.main.cpp`](task1.main.cpp)\n",
"- Ihre Implementierung erfolgt ebenfalls in [`task1.main.cpp`](task1.main.cpp)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Aufgabe 2: Member Funktionen und Klassen-Invarianten (1 Punkt)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Gegeben ist die Definition dreier Klassen `BBox`, `Cirlce` und `Triangle`. Die Klassen sind sog. `aggregate`-Klassen und weisen u.A. folgende Eigenschaften auf:\n",
"\n",
"- Ausschließlich öffentliche Member-Variablen\n",
"- Keine benutzerdefinierten Konstruktoren\n",
"- Parameterlose Konstruktion möglich, z.B. `Aggregate aggregate = {};`\n",
"- Listen-Initialisierung ist möglich, z.B. `Aggregate aggregate = { value1, valu2 };`\n",
"- Struktuierte Zuweisung ist möglich, z.B. `const auto& [m1, m2] = aggregate;`\n",
"\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Implementieren Sie die folgenden Member-Funktionen:\n",
"\n",
"```cpp\n",
"namespace task2 {\n",
"\n",
"using Vec2d = std::array<double, 2>;\n",
"\n",
"/// @brief Axis-aligned bounding box\n",
"struct BBox {\n",
" Vec2d min; ///< coord of bottom left corner\n",
" Vec2d max; ///< coord of top right corner\n",
" BBox scale(const Vec2d& org, double s) const; // todo\n",
" BBox translate(const Vec2d& offset) const; // todo\n",
" bool check_invariants() const; // todo\n",
"};\n",
"\n",
"/// @brief Circle\n",
"struct Circle {\n",
" Vec2d c; ///< coordinate of the center of the circle\n",
" double r; ///< radius of the circle\n",
" BBox bbox() const; // todo\n",
" Circle scale(const Vec2d& org, double s) const; // todo\n",
" Circle rotate(const Vec2d& org, double angle) const; // todo\n",
" Circle translate(const Vec2d& offset) const; // todo\n",
" bool check_invariants() const; // todo\n",
"};\n",
"\n",
"/// @brief Triangle\n",
"struct Triangle {\n",
" std::array<Vec2d, 3> abc; ///< three corner points of the triangle\n",
" BBox bbox() const; // todo\n",
" Triangle scale(const Vec2d& org, double s) const; // todo\n",
" Triangle rotate(const Vec2d& org, double angle) const;// todo\n",
" Triangle translate(const Vec2d& offset) const; // todo\n",
" bool check_invariants() const; // todo\n",
"};\n",
"```"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"- Die vorgegebenen Deklarationen und eine genaue Beschreibung und Anforderungen finden Sie in [`task2.hpp`](task2.hpp)\n",
"- Ihre Implementierung erfolgt in [`task2.cpp`](task2.cpp)\n",
"- Die zugeordneten Tests finden Sie in [`task2.test.cpp`](task2.test.cpp)\n",
"- In [`task2.misc.hpp`](task2.misc.hpp)/[`task2.misc.cpp`](task2.misc.cpp) sind Hilfsfunktionen zum Ausgeben und Vergleichen der drei Klassen gegeben (diese werden bei den Tests verwendet, stehen Ihnen aber auch für Ihre Implementierung zur Verfügung).\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Aufgabe 3: Nutzung von bereitgestellter Funktionalität sowie der Implementierung aus Aufgabe 2 zum Erstellen einer eigenen `.svg`-Grafik (1 Punkt)\n",
"\n",
"Sie sollten die Funktionalität, die Sie in Aufgabe 2 implementiert haben (Skalieren/Verschieben/Rotieren) nun selbst nutzen um eine `.svg`-Grafik zu erstellen.\n",
"\n",
"Nutzen Sie die bereitgestellte Funktion `task3::render_wrapper` um die `.svg`-Grafik zu generieren: Sie können die Typen aus Aufgabe 2 (`BBox/Circle/Triangle`) direkt übergeben:\n",
"\n",
"```cpp\n",
"// std::vector<task2::BBox> boxes = [ ... ]\n",
"// std::vector<task2::Circle> circles = [ ... ]\n",
"// std::vector<task2::Triangle> triangles = [ ... ]\n",
"task3::render_wrapper(\"myimage.svg\", boxes, triangles, triangles);\n",
"```\n",
"\n",
"Es gibt keine Vorgaben, lediglich, dass die erstellte Grafik mindestens 20 Elemente (Boxen/Kreise/Dreiecke) enthalten muss. \n",
"\n",
"Hier ein Beispiel wie so etwas aussehen kann \n",
"\n",
"- horizontal verschobene und skalierte \"Häuser\" mit \"Himmel\" aus zufällig angeordneten Kreisen:\n",
"\n",
"\t![images/dusty_nikolaus_city.svg](images/dusty_nikolaus_city.svg)\n",
"\n",
"- horizontal verschobene \"Lokomotiven\"\n",
"\n",
"\t![images/trains.svg](images/trains.svg)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Implementieren Sie folgende Funktion:\n",
"\n",
"```cpp\n",
"\n",
"namespace task3 {\n",
"\n",
"int render_something(std::filesystem::path filepath); // todo\n",
"\n",
"}\n",
"```"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"- Die vorgegebenen Deklaration und eine genaue Beschreibung und Anforderungen finden Sie in [`task3.hpp`](task3.hpp)\n",
"- Ihre Implementierung erfolgt in [`task3.cpp`](task3.cpp)\n",
"- Die zugeordneten Tests finden Sie in [`task3.test.cpp`](task3.test.cpp)\n",
"- In [`task3.misc.hpp`](task3.misc.hpp)/[`task3.misc.cpp`](task3.misc.cpp) finden Sie die oben erwähnte Hilfsfunktion `task3::render_wrapper`.\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Kompilieren/Testen\n",
"\n",
"So testen Sie Ihre Implementierung (direkter Aufruf von `g++` und `python`):\n",
"\n",
"```shell\n",
"# prepare\n",
"mkdir build\n",
"# compile\n",
"g++ -g -std=c++20 task1.main.cpp -o build/task1\n",
"g++ -g -Imodules -std=c++20 task2.cpp task2.misc.cpp task2.test.cpp -o build/task2\n",
"g++ -g -Imodules -std=c++20 task2.cpp task2.misc.cpp task3.cpp task3.misc.cpp task3.test.cpp -o build/task3\n",
"\n",
"# run tests\n",
"./build/task1\n",
"./build/task2\n",
"./build/task3\n",
"```\n",
"\n",
"Alternativ (mittels CMake-Configuration):s\n",
"\n",
"```shell\n",
"# prepare\n",
"cmake -S . -B build -D CMAKE_BUILD_TYPE=Debug\n",
"# compile\n",
"cmake --build build --config Debug --target task1\n",
"cmake --build build --config Debug --target task2\n",
"cmake --build build --config Debug --target task3\n",
"cmake --build build --config Debug # all\n",
"# run tests\n",
"ctest --test-dir build -C Debug -R task1 \n",
"ctest --test-dir build -C Debug -R task2 \n",
"ctest --test-dir build -C Debug -R task3 \n",
"ctest --test-dir build -C Debug # all\n",
"``` \n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.15"
}
},
"nbformat": 4,
"nbformat_minor": 2
}