Huhu,
für ein privates Projektchen hab ich ein paar Klassen für Vektoren und (quadratische) Matrizen geschrieben. Ich weiß, dass es die schon gibt, aber mir geht es gerade darum, die selbst zu implementieren.
Allerdings bin ich mir bei der Umsetzung unsicher: vor allem damit, dass die Dinger verschiedene Dimensionen haben können, hab ich Probleme. Ich liste mal die Möglichkeiten auf, die mir bisher eingefallen sind (in der Hoffnung, es hat jemand eine bessere Idee ). Ich red jetzt mal nur von den Vektoren, aber das gleiche gilt für die Matrizen:
für ein privates Projektchen hab ich ein paar Klassen für Vektoren und (quadratische) Matrizen geschrieben. Ich weiß, dass es die schon gibt, aber mir geht es gerade darum, die selbst zu implementieren.
Allerdings bin ich mir bei der Umsetzung unsicher: vor allem damit, dass die Dinger verschiedene Dimensionen haben können, hab ich Probleme. Ich liste mal die Möglichkeiten auf, die mir bisher eingefallen sind (in der Hoffnung, es hat jemand eine bessere Idee ). Ich red jetzt mal nur von den Vektoren, aber das gleiche gilt für die Matrizen:
- Wie ich es bisher umgesetzt hab (und wie es anscheinend auch in javax.vecmath gemacht wurde): unterschiedliche Klassen für Vektoren mit unterschiedlichen Dimensionen Vector2, Vector3, Vector4. Keine Beziehungen der Klassen untereinander. Nachteil: Extrem viel redundanter Code.
- Meine erste Idee war: eine einzige Klasse, die ein Array der verschiedenen Koeffizienten hält. Aus der Arraylänge ergibt sich die Dimension. Nachteile: man müsste jede Methode der Klasse in etwa so beginnen:
[HIGHLIGHT="Java"]public void add (Vector other) {
if (other == null || other.getDimension() != this.getDimension()) {
throw new IllegalArgumentException(...);
}
...
}[/HIGHLIGHT]
Das finde ich irgendwie nicht schön (irgendwas in meinem Kopf schreit da außerdem was von "Performance", aber das versuche ich mal nicht zu beachten - vor allem weil die anderen Lösungen in der Hinsicht auch nicht besser sind). Insbesondere ein Kreuzprodukt würde schwierig. Solchen Code fände ich extrem seltsam:
[HIGHLIGHT="Java"]public Vector cross (Vector other) {
if (this.getDimension() != 3) {
throw new IllegalStateException(...);
if (other == null || other.getDimension() != 3) {
throw new IllegalArgumentException(...);
}
...
}[/HIGHLIGHT] - Kleine Verbesserung: Wie gerade eben, aber Unterklassen für die verschiedenen Dimensionen, oder zumindest für die dritte Dimension - dann könnte man das Kreuzprodukt nur in dieser Klasse implementieren. Die andere Problematik bleibt aber erhalten, außer man geht soweit dass man wieder bei Fall 1 ankommt.
- Vererbung: ein 2D-Vektor "ist ein" 3D-Vektor, in einem gewissen Sinne. Das führt aber dazu, dass z.B. Vector3 immernoch die Methode dotProduct(Vector2) erbt - die dann die ersten Komponenten einfach vernachlässigt. Auch sonst eigentlich irgendwie nicht viele Vorteile.
- Komposition: wäre zwar vertretbar, fände ich aber trotzdem komisch. Ein Vector4 besteht aus einem double und einem Vector3, der wiederum aus einem double und einem Vector2 besteht, der aus 2 doubles besteht Das sähe dann irgendwie so aus:
[HIGHLIGHT="Java"]public void add(Vector4 other)
{
if (other == null) {
throw new IllegalArgumentException(...);
}
this.w += other.w;
this.vec3.add (other.vec3);
}
public double dotProduct(Vector4 other)
{
if (other == null) {
throw new IllegalArgumentException(...);
}
return this.vec3.dotProduct(other.vec3) + this.w * other.w;
}
[/HIGHLIGHT]
Den Code eben könnte man vielleicht mit Generics sogar noch verallgemeinern, dass er auch für Vector3 gilt (und, angenommen ich mach noch eine Vector1-Klasse, dann könnte er auch für Vector2 gelten). Das macht es aber nicht gerade mehr intuitiv.
Edit: Der Klassenname "VectorThatHas1DimensionMoreThan<T extends Vector>" würde mich allerdings durchaus reizen
Zuletzt bearbeitet: