Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
| talit:csharp_oop [2025-05-12 10:43] – sca | talit:csharp_oop [2025-05-18 13:30] (aktuell) – [Auftrag im Detail] sca | ||
|---|---|---|---|
| Zeile 26: | Zeile 26: | ||
| 1. [[https:// | 1. [[https:// | ||
| 1. [[https:// | 1. [[https:// | ||
| - | 1. Füge nun deiner Vector-Klasse die **Eigenschaften** `Dim` (für Dimension), `Magnitude` | + | 1. Programmiere nun den Konstruktor aus: Speichere die dem Konstruktor übergebenen Werte in einem *privaten* Feld `components`, |
| + | 1. Die Komponenten sind unveränderbar. | ||
| + | 1. Die Komponenten sind nur veränderbar, | ||
| + | 1. Füge nun deiner Vector-Klasse die **Eigenschaften** `Dim` (für Dimension) | ||
| 1. Informiere dich nun über **statische und nicht-statische Methoden**, z.B. hier; [[https:// | 1. Informiere dich nun über **statische und nicht-statische Methoden**, z.B. hier; [[https:// | ||
| 1. Füge deiner Klasse folgende (nicht-statische) public **Methoden** hinzu: `IsZeroVector()` und `IsUnitVector()`. Diese geben den Bool true oder false zurück, je nachdem ob es sich beim Vektor um einen Nullvektor oder einen Einheitsvektor (unit vector) handelt.\\ Achtung: Da wir mit doubles Arbeiten, können schnell Rundungsfehler entstehen. Es kann deshalb sein, dass die Länge des Vektors eigentlich $0$ wäre, der Code aber eine ganz kleine Zahl berechnet. Deshalb sollte man der Klasse eine Eigenschaft `accuracy` geben: Ist der Betrag des Werts kleiner dieser Genauigkeit, | 1. Füge deiner Klasse folgende (nicht-statische) public **Methoden** hinzu: `IsZeroVector()` und `IsUnitVector()`. Diese geben den Bool true oder false zurück, je nachdem ob es sich beim Vektor um einen Nullvektor oder einen Einheitsvektor (unit vector) handelt.\\ Achtung: Da wir mit doubles Arbeiten, können schnell Rundungsfehler entstehen. Es kann deshalb sein, dass die Länge des Vektors eigentlich $0$ wäre, der Code aber eine ganz kleine Zahl berechnet. Deshalb sollte man der Klasse eine Eigenschaft `accuracy` geben: Ist der Betrag des Werts kleiner dieser Genauigkeit, | ||
| Zeile 32: | Zeile 35: | ||
| 1. Die beiden Rechenmethoden vom letzten Punkt sollen können nur Funktionieren, | 1. Die beiden Rechenmethoden vom letzten Punkt sollen können nur Funktionieren, | ||
| 1. Nun wollen wir aber nicht immer `Vector.Sub(v1, | 1. Nun wollen wir aber nicht immer `Vector.Sub(v1, | ||
| + | 1. Aktuell gibt der Befehl `System.Console.WriteLine(v); | ||
| 1. Über eine Eigenschaft soll von einem Vektor der zugehörige **Einheitsvektor** ausgegeben werden: `v.UnitVector`. Dieser Einheitsvektor soll *selbst wieder vom Typ Vector* sein! Um von einem Vektor den zugehörigen Einheitsvektor zu erhalten, dividiert man jede Komponente des Vektors durch die Länge des gesamten Vektors. *Tipp:* Überlege dir gut, *wo* genau der Einheitsvektor berechnet werden soll!\\ \\ | 1. Über eine Eigenschaft soll von einem Vektor der zugehörige **Einheitsvektor** ausgegeben werden: `v.UnitVector`. Dieser Einheitsvektor soll *selbst wieder vom Typ Vector* sein! Um von einem Vektor den zugehörigen Einheitsvektor zu erhalten, dividiert man jede Komponente des Vektors durch die Länge des gesamten Vektors. *Tipp:* Überlege dir gut, *wo* genau der Einheitsvektor berechnet werden soll!\\ \\ | ||
| + | 1. Es ist etwas umständlich, | ||
| + | 1. Erweitere nun deine Klasse beliebig. Hier einige Vorschläge: | ||
| + | 1. Weiter Operationen: | ||
| + | 1. `DotProduct` | ||
| + | 1. `ScalarMultiplication` (überladen, | ||
| + | 1. `VectorProduct` (nur für 3D Vektoren) | ||
| + | 1. Winkel zwischen zwei Vektoren: `AngleInRad` , `AngleInRad` | ||
| + | 1. Zwei Vektoren vergleichen: | ||
| + | 1. **Operatoren überladen**: | ||
| + | 1. **Optional: | ||
| - | **Neue Features:** | + | <nodisp 2> |
| - | 1. Ein bestehender Vektor soll überschrieben werden können, aber nur, wenn er die //gleiche Dimension// wie der bestehende hat. Dazu soll man einfach `v.Components` neu setzen können. Dies geschieht im //setter// der Components-Eigenschaft. | + | ++++Weiteres| |
| - | + | ||
| - | ===== Zusatzaufgaben ===== | + | |
| - | + | ||
| - | 1. Für 3er Vektoren soll nun auch das **Vektorprodukt** berechnet werden können. [[https:// | + | |
| - | 1. Füge nun auch die Skalarmultiplikation hinzu. Dort wird ein Vektor mit einer reellen Zahl gestreckt oder gestaucht. Der Operator `*` soll so überladen werden, dass `v1*v2` das Skalarprodukt ergibt und (s sei eine Zahl, kein Vektor) `v*s` oder `s*v` die Skalarmultiplikation.\\ \\ | + | |
| - | 1. Erweitere deine Klasse mit weiteren sinnvollen Methoden usw.\\ \\ | + | |
| - | 1. Falls du sehr motiviert bist, könntest du eine Klasse *Matrix* definieren, mit der man Matrizen-Rechnungen durchführen kann. | + | |
| ===== 2D-Drawing ===== | ===== 2D-Drawing ===== | ||
| Zeile 109: | Zeile 116: | ||
| * Scene untersucht für alle möglichen Paare von Körpern, ob sie sich berühren und führt die Kollision aus. | * Scene untersucht für alle möglichen Paare von Körpern, ob sie sich berühren und führt die Kollision aus. | ||
| + | ++++ | ||
| + | |||
| + | </ | ||