{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 1: Ein eigenes kleines C++-Programm (*std::set*/*std::unordered_set*) (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 // std::cout, std::endl\n", "\t#include // std::set, std::unordered_set\n", "\t#include // std::vector\n", "\t...\n", "\t```\n", "- Definition/Implementierung einer eigenen Funktion in einem eignene Namensraum, z.B.:\n", "\t```cpp\n", "\tnamespace task1 {\n", "\n", "\t...\n", "\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", "\n", "\t ...\n", "\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: Freie Funktionen zur Selektion von zweidimensionalen Koordinaten (1 Punkt)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Die von Ihnen zu implementierenden freien Funktionen wählen aus einer Sequenz von Koordinaten diejenigen aus, die bei Übergabe an eine ebenfalls übergebene Funktion `true` zurückgeben.\n", "\n", "Die Rückgabe der ausgewählten Koordinaten erfolgt nicht direkt über eine Liste von Koordinatenwerten, sondern indirekt über eine Liste von Indizes. \n", "\n", "Hinweis: In Aufgabe 3 werden Sie Ihre Funktionen im Zusammenhang mit der Klasse `ex5::TriangleMesh` anwenden.\n", "\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Implementieren Sie die folgende freie Funktionen:\n", "\n", "```cpp\n", "namespace task2 {\n", "\n", "\n", "using Vec2d = std::array;\n", "using Circle = std::tuple;\n", "using BBox = std::tuple;\n", "using Region = std::function;\n", "\n", "// todo\n", "std::unordered_set select(const std::vector& vertices, \n", " const Region& region, \n", " bool invert = false);\n", "// todo\n", "std::unordered_set select_union(const std::vector& vertices, \n", " const std::vector& regions,\n", " bool invert = false);\n", "\n", "} \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)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 3: Erzeugen eines Dreiecksgitters für zwei Kreisringe (1 Punkt)\n", "\n", "Sie implementieren eine Funktion, die mittels der Klasse `ex5::TriangleMesh` zuerst ein rechteckiges Dreiecksgitter erstellt, und dann mittels\n", "\n", "- der von Ihnen implementierten Funktionen `task2::select`/`task2::select_union` und \n", "- der öffentlichen Schnittstellen der Klasse `ex5::TriangleMesh` \n", "\n", "Dreiecke aus dem Gitter entfernt, so dass schlussendlich ein Dreiecksgitter nur innerhalb zweier Kreisringe bestehen bleibt. \n", "\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Implementieren Sie folgende Funktion:\n", "\n", "```cpp\n", "\n", "#include \"TriangleMesh.hpp\" // ex5::TriangleMesh\n", "\n", "namespace task3 {\n", "\n", "// todo\n", "ex5::TriangleMesh generate_double_annulus(task2::Vec2d c1, task2::Vec2d c2, double r, double R, double h);\n", "\n", "}\n", "```" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "vscode": { "languageId": "plaintext" } }, "source": [ "Dies sieht dann abhängig von den Koordinaten der Kreismittelpunkte, Radien und Gitterauflösung z.B. so aus:\n", "\n", "![images/annuluses1.svg](images/annuluses1.svg)\n", "\n", "\n", "\n", "![images/annuluses3.svg](images/annuluses3.svg)\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 [`TriangleMesh.hpp`](TriangleMesh.hpp)/[`TriangleMesh.cpp`](TriangleMesh.cpp) finden Sie die vorgegebene Implementierung für `ex5::TriangleMesh`\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.test.cpp -o build/task2\n", "g++ -g -Imodules -std=c++20 TriangleMesh.cpp task2.cpp task3.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):\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 --verbose\n", "ctest --test-dir build -C Debug -R task2 --verbose\n", "ctest --test-dir build -C Debug -R task3 --verbose\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 }