{ "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 // std::array\n", "\t#include // std::sin, std::cos\n", "\t#include // std::cout, std::endl\n", "\t#include // 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;\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;\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 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 boxes = [ ... ]\n", "// std::vector circles = [ ... ]\n", "// std::vector 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 }