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. | ||
+ | ++++ | ||
+ | |||
+ | </ |