diff --git a/Assignment_004/kryptonier.jpg b/Assignment_004/kryptonier.jpg new file mode 100644 index 0000000..562f662 Binary files /dev/null and b/Assignment_004/kryptonier.jpg differ diff --git a/Assignment_004/readme.md b/Assignment_004/readme.md new file mode 100644 index 0000000..cade38f --- /dev/null +++ b/Assignment_004/readme.md @@ -0,0 +1,109 @@ +# Vektor + +**🎓 Benotetes Assignment 🎓** + +📆 **Fällig: 22.10.2025** 📆 + +Sie haben schon wieder die ganze Nacht Netflix gesuchtet. Dabei waren auch eine Reihe von Science Fiction und Superhelden-Filmen. Jetzt träumen Sie natürlich sehr intensiv. In Ihrem Traum müssen Sie noch einmal die Vorlesung MA2 besuchen und die Klausur dazu schreiben - obwohl Sie all Ihre Mathe-Prüfungen bereits mit Bravour bestanden haben. Als Sie aufwachen, beschließen Sie die MA2 für immer aus Ihrem Leben zu verbannen, indem Sie sich passende Klassen und Programme schreiben. + +Raumschiff + +Gerade als Sie merken, dass diese blöden Geschichten Sie überhaupt nicht zur Bearbeitung der Assignments motivieren passiert es ... Es gibt einen lauten Knall. Sie schauen zum Himmel uns sehen dort ein Raumschiff der Kryptonier, die offensichtlich die Weltherrschaft an sich reißen wollen - woher Sie das wisse? Natürlich aus den vielen Filmen, die Sie gesehen haben: Aliens = böse. Zum Glück haben Sie noch eine kleine Rakete im Garten (woher auch immer die stammt), die Sie auf das Raumschiff abfeuern könnten. Aber wie bloß die Flugbahn berechnen? + +Plötzlich dämmert es Ihnen: Flugbahnen berechnet man mithilfe der linearen Algebra, insbesondere mit Vektoren. Gesagt, getan... + +## Paket + +Gehen Sie in das Paket [pr2.strukturierung.vektor](../sources/src/main/java/pr2/strukturierung/vektor). + +## Implementierung + +Implementieren Sie eine Klasse `Vektor` mit deren Hilfe man dreidimensionale Vektoren erzeugen und die wichtigsten Vektor-Operationen durchführen kann. Die Komponenten des Vektors sollen reelle Zahlen sein, verwenden Sie daher zur Darstellung und Speicherung der Werte bitte eine Fließkommazahl mit doppelter Genauigkeit. + +Die Objekte der Klasse `Vektor` sollen unveränderlich (immutable) sein. + +`Vektor` soll die folgenden Aktionen unterstützen: + + * Anlegen eines neuen Vektors und Befüllen des Vektors mit Daten (`new Vektor(1.0, 2.0, 3.0)`) + * Erzeugen eines Nullvektors (alle drei Komponenten [x,y,z] sind 0) (`new Vektor()`) + * Addieren zweier Vektoren (`addiere`) + * Subtrahieren zweier Vektoren (`subtrahiere`) + * Auslesen einzelner Komponenten x, y und z (`getX`, `getY`, `getZ`) + * Multiplikation des Vektors mit einem Skalar (`multiply`) + * Skalarmultiplikation zweier Vektoren (`multipliziere`) + * Kreuzprodukt zweier Vektoren (`kreuzprodukt`) + * Erzeugung des Einheitsvektors aus einem gegebenen Vektor (d.h. Vektor der Länge 1 mit derselben Richtung wie der ursprüngliche Vektor) (`einheitsvektor`) + * Berechnung des Betrages (der Länge) eines Vektors (`betrag`) + * Test, ob zwei Vektoren kollinear (parallel oder antiparallel) sind (`isKollinear`) + * Bestimmen des eingeschlossenen Winkels zweier Vektoren (`winkel`) + +Bitte denken Sie daran, auch eine Methode zu implementieren mit dem man testen kann, ob zwei Vektoren gleich sind (`equals`). Weiterhin ist es für die Programmentwicklung und den Test empfehlenswert eine Methode zur Konvertierung des Vektors in eine Zeichenkette zu implementieren (`toString`). + +Vergessen Sie nicht, Ihre Methoden ausgiebig mit **JavaDoc** zu dokumentieren. + +## Test + +Überprüfen Sie die Funktionalität Ihrer Implementierung mit entsprechenden JUnit-Tests und weise Sie mit diesen Tests nach, dass die implementierten Operationen richtig funktionieren. Verwenden Sie bitte _mindestens_ die folgenden Testdaten: + +### Multiplikation mit einem Skalar + + +\( 6\cdot\begin{pmatrix}1 \\ -5 \\ 3\end{pmatrix} = \begin{pmatrix}6 \\ -30 \\ 18\end{pmatrix} \) + +\( -3\cdot\begin{pmatrix}1 \\ -5 \\ 3\end{pmatrix} = \begin{pmatrix}-3 \\ 15 \\ -9\end{pmatrix} \) + +### Skalarprodukt zweier Vektoren + +\( \begin{pmatrix}1 \\ 2 \\ 3\end{pmatrix}\cdot\begin{pmatrix}-7 \\ 8 \\ 9\end{pmatrix} = 36 \) + +\( \begin{pmatrix}-5 \\ 9 \\ 7\end{pmatrix}\cdot\begin{pmatrix}10 \\ 3 \\ 8\end{pmatrix} = 33 \) + +### Addition und Subtraktion + +\( \begin{pmatrix}4 \\ 0 \\ 8\end{pmatrix}{+}\begin{pmatrix}-1 \\ 4 \\ 7\end{pmatrix} = \begin{pmatrix}3 \\ 4 \\ 15\end{pmatrix} \) + +\( \begin{pmatrix}4 \\ 0 \\ 8\end{pmatrix}{-}\begin{pmatrix}-1 \\ 4 \\ 7\end{pmatrix} = \begin{pmatrix}5 \\ -4 \\ 1\end{pmatrix} \) + +\( \begin{pmatrix}4 \\ 0 \\ 8\end{pmatrix}{+}\begin{pmatrix}-1 \\ 4 \\ 7\end{pmatrix} = \begin{pmatrix}-1 \\ 4 \\ 7\end{pmatrix}{+}\begin{pmatrix}4 \\ 0 \\ 8\end{pmatrix} \) + +### Kreuzprodukt + +\( \begin{pmatrix}1 \\ 2 \\ 3\end{pmatrix}\times\begin{pmatrix}-7 \\ 8 \\ 9\end{pmatrix} = \begin{pmatrix}-6 \\ -30 \\ 22\end{pmatrix} \) + +\( \begin{pmatrix}1 \\ 2 \\ 8\end{pmatrix}\times\begin{pmatrix}4 \\ 3 \\ 5\end{pmatrix} = \begin{pmatrix}-14 \\ 27 \\ -5\end{pmatrix} \) + +### Betrag + +\( \left|\begin{pmatrix}1 \\ 1 \\ 1\end{pmatrix}\right| = \sqrt{3} \) + +\( \left|\begin{pmatrix}5 \\ 4 \\ 3\end{pmatrix}\right| = \sqrt{50} \) + +### Kollinearität und Winkel + +\( \begin{pmatrix}4 \\ 5 \\ 7\end{pmatrix} \) und \( \begin{pmatrix}16 \\ 20 \\ 28\end{pmatrix} \) sind kollinear. + +\( \begin{pmatrix}4 \\ 5 \\ 7\end{pmatrix} \) und \( \begin{pmatrix}16 \\ 20 \\ 21\end{pmatrix} \) sind nicht kollinear. + +Der Winkel zwischen \( \begin{pmatrix}3 \\ -1 \\ 2\end{pmatrix} \) und \( \begin{pmatrix}1 \\ 2 \\ 4\end{pmatrix} \) beträgt \( 58,3^{\circ} \). + +### Komplexere Rechnungen + +\[ +\left[ +\begin{pmatrix}-1 \\ 5 \\ -2\end{pmatrix}\times\begin{pmatrix}2 \\ 1 \\ 2\end{pmatrix} +\right] +\cdot\begin{pmatrix}2 \\ 0 \\ 5\end{pmatrix} = -31 +\] + + +## Abgabe + +Alle Abgaben für die Vorlesung erfolgen über `git`. + +Hierzu gehen Sie wie folgt vor: + + 1. Öffnen Sie eine Kommandozeile (Terminal). + 2. Gehen Sie in Ihr Working Directory. + 3. Rufen Sie mit `bin/submit.sh` das Skript auf, das die Lösungen testet und kompiliert. Wenn Maven eine Fehlermeldung zeigt, beheben Sie diese zuerst, bevor Sie mit dem nächsten Schritt fortfahren. + 4. Wenn Sie Meldung "✅ Projekt gebaut" bekommen, checken Sie Ihre Änderungen in `git` **auf der Kommandozeile** ein (comitten), d.h. mit `git add` und `git commit`. Verwenden Sie **nicht** Eclipse für diesen Schritt. + 5. Rufen Sie mit `bin/submit.sh` erneut das Skript auf. Wenn alles klappt, bekommen Sie die Anzeige "✅ Aktuelle Lösungen eingereicht" und Ihre Lösung ist im System angekommen. \ No newline at end of file diff --git a/readme.md b/readme.md index 16b28c6..5023725 100644 --- a/readme.md +++ b/readme.md @@ -168,6 +168,7 @@ Wichtige Einstellungen für Eclipse sind [hier](help/eclipse.md) beschrieben. | 1. | 23.09.2025 | [Umgebung aufsetzen](Assignment_001/readme.md) | **01.10.2025** | | 2. | 23.09.2025 | [Erster Commit](Assignment_002/readme.md) | **01.10.2025** | | 3. | 01.10.2025 | [Stein, Papier, Schere (, Echse, Spock)](Assignment_003/readme.md) | **07.10.2025** | +| 4. | 08.10.2025 | [Vektor](Assignment_004/readme.md) | **22.10.2025** | ## 😀 Freiwillige Übungen Die freiwilligen Übungen zur Vertiefung der Vorlesungsinhalte finden Sie in einem getrennten Repository: [Freiwillige Übungen](/pr2-lecture/uebungen/src/branch/master/readme.md). diff --git a/solutions/checkstyle.xml b/solutions/checkstyle.xml index 546266a..8108f76 100644 --- a/solutions/checkstyle.xml +++ b/solutions/checkstyle.xml @@ -31,6 +31,7 @@ --> + @@ -200,5 +201,5 @@ - + diff --git a/sources/checkstyle.xml b/sources/checkstyle.xml index 546266a..8108f76 100644 --- a/sources/checkstyle.xml +++ b/sources/checkstyle.xml @@ -31,6 +31,7 @@ --> + @@ -200,5 +201,5 @@ - + diff --git a/sources/src/main/java/pr2/strukturierung/vektor/Vektor.java b/sources/src/main/java/pr2/strukturierung/vektor/Vektor.java new file mode 100644 index 0000000..c138636 --- /dev/null +++ b/sources/src/main/java/pr2/strukturierung/vektor/Vektor.java @@ -0,0 +1,24 @@ +package pr2.strukturierung.vektor; + +import java.util.Arrays; + +/** + * Einfache Implementierung eines dreidimensionalen Vektors, der grundlegende + * Vektor-Operationen unterstützt. + *

+ * Neue Instanzen werden mithilfe des Konstruktors erzeugt und initialisiert. + * + *

+ * Vektor vektor = new Vektor(1, 5, 4);
+ * 
+ *

+ * Die Klasse erlaubt es, Vektoren zu addieren, subtrahieren, mit einem skalar + * oder einem anderen Vektor zu multiplizieren. Weiterhin können auch noch der + * Betrag und das Kreuzprodukt bestimmt werden. + *

+ * Objekte dieser Klasse sind immutable. Die Methoden verändern den Zustand des + * Objektes nicht, sondern geben ein neues Objekt zurück. + */ +public class Vektor { + +} diff --git a/sources/src/test/java/pr2/strukturierung/vektor/VektorTest.java b/sources/src/test/java/pr2/strukturierung/vektor/VektorTest.java new file mode 100644 index 0000000..39dbf8c --- /dev/null +++ b/sources/src/test/java/pr2/strukturierung/vektor/VektorTest.java @@ -0,0 +1,159 @@ +package pr2.strukturierung.vektor; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Test für die Klasse Vektor. + */ +class VektorTest { + + @Test + void testCreation() { + + Vektor vektor = new Vektor(3, 1, -5); + + assertEquals(3, vektor.getX(), 0.01d); + assertEquals(1, vektor.getY(), 0.01d); + assertEquals(-5, vektor.getZ(), 0.01d); + } + + @Test + void testEqualsAndHashCode() { + + Vektor vektor1 = new Vektor(5, 7, 9); + Vektor vektor2 = new Vektor(5, 7, 9); + Vektor vektor3 = new Vektor(5, 7, 2); + Vektor vektor4 = new Vektor(5, 3, 9); + Vektor vektor5 = new Vektor(5, 7, 8); + + assertEquals(vektor1, vektor2); + assertEquals(vektor2, vektor1); + assertEquals(vektor1, vektor1); + assertEquals(vektor2, vektor2); + + assertNotEquals(vektor1, vektor3); + assertNotEquals(vektor1, vektor4); + assertNotEquals(vektor1, vektor5); + + assertNotEquals(vektor3, vektor1); + assertNotEquals(vektor4, vektor1); + assertNotEquals(vektor5, vektor1); + + assertNotEquals(null, vektor1); + assertNotEquals("Hello", vektor1); + + assertEquals(vektor1.hashCode(), vektor2.hashCode()); + } + + @Test + void testSkalarMultiplikationSkalar() { + + Vektor vektor1 = new Vektor(1, -5, 3); + Vektor ergebnis1 = new Vektor(6, -30, 18); + + Vektor vektor2 = new Vektor(1, -5, 3); + Vektor ergebnis2 = new Vektor(-3, 15, -9); + + assertEquals(ergebnis1, vektor1.multipliziere(6)); + assertEquals(ergebnis2, vektor2.multipliziere(-3)); + + Vektor vektor3 = new Vektor(3, 4, 5); + assertEquals(1, vektor3.einheitsvektor().betrag(), 0.01d); + } + + @Test + void testSkalarMultiplikationVektor() { + + Vektor vektor1 = new Vektor(1, 2, 3); + Vektor vektor2 = new Vektor(-7, 8, 9); + double ergebnis = 36; + + assertEquals(ergebnis, vektor1.multipliziere(vektor2), 0.0001); + + Vektor vektor3 = new Vektor(-5, 9, 7); + Vektor vektor4 = new Vektor(10, 3, 8); + double ergebnis2 = 33; + + assertEquals(ergebnis2, vektor3.multipliziere(vektor4), 0.0001); + + } + + @Test + void testAdditionUndSubtraktion() { + + Vektor a = new Vektor(4, 0, 8); + Vektor b = new Vektor(-1, 4, 7); + Vektor c = new Vektor(3, 4, 15); + Vektor d = new Vektor(5, -4, 1); + + assertEquals(c, a.addiere(b)); + assertEquals(d, a.subtrahiere(b)); + assertEquals(d, b.subtrahiere(a).multipliziere(-1)); + assertEquals(a.addiere(b), b.addiere(a)); + assertEquals(a, a.addiere(b).subtrahiere(b)); + } + + @Test + void testBetrag() { + + Vektor a = new Vektor(1, 1, 1); + Vektor b = new Vektor(2, 0, 0); + Vektor c = new Vektor(3, 4, 5); + + assertEquals(Math.sqrt(3), a.betrag(), 0.00001); + assertEquals(2, b.betrag(), 0.00001); + assertEquals(Math.sqrt(50), c.betrag(), 0.00001); + } + + @Test + void testKreuzprodukt() { + + Vektor a = new Vektor(1, 2, 3); + Vektor b = new Vektor(-7, 8, 9); + Vektor c = new Vektor(-6, -30, 22); + + assertEquals(c, a.kreuzprodukt(b)); + } + + @Test + void testAufgabenStellung1() { + Vektor a = new Vektor(2, 0, 5); + Vektor b = new Vektor(-1, 5, -2); + Vektor c = new Vektor(2, 1, 2); + assertEquals(-31, b.kreuzprodukt(c).multipliziere(a), 0.001d); + } + + @Test + void testAufgabenStellung2() { + Vektor a = new Vektor(1, 2, 8); + Vektor b = new Vektor(4, 3, 5); + Vektor e = new Vektor(-14, 27, -5); + assertEquals(e, a.kreuzprodukt(b)); + } + + @Test + void testAufgabenStellung3() { + Vektor a = new Vektor(1, -2, 2); + Vektor b = new Vektor(3, 2, -4); + assertEquals(-9, a.multipliziere(b), 0.001d); + } + + @Test + void testKollinear() { + Vektor a = new Vektor(4, 5, 7); + Vektor b = new Vektor(16, 20, 28); + assertTrue(a.isKollinear(b)); + + Vektor c = new Vektor(16, 20, 21); + assertFalse(a.isKollinear(c)); + } + + @Test + void testWinkel() { + Vektor a = new Vektor(3, -1, 2); + Vektor b = new Vektor(1, 2, 4); + assertEquals(58.3, a.winkel(b), 0.1d); + } +}