243 lines
7.4 KiB
Plaintext
243 lines
7.4 KiB
Plaintext
{
|
|
"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 <iostream> // std::cout, std::endl\n",
|
|
"\t#include <set> // std::set, std::unordered_set\n",
|
|
"\t#include <vector> // 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<double, 2>;\n",
|
|
"using Circle = std::tuple<Vec2d, double>;\n",
|
|
"using BBox = std::tuple<Vec2d, Vec2d>;\n",
|
|
"using Region = std::function<bool(Vec2d)>;\n",
|
|
"\n",
|
|
"// todo\n",
|
|
"std::unordered_set<size_t> select(const std::vector<Vec2d>& vertices, \n",
|
|
" const Region& region, \n",
|
|
" bool invert = false);\n",
|
|
"// todo\n",
|
|
"std::unordered_set<size_t> select_union(const std::vector<Vec2d>& vertices, \n",
|
|
" const std::vector<Region>& 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",
|
|
"\n",
|
|
"\n",
|
|
"<!--  -->\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 [`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
|
|
}
|