von Matrix Klasse erben
-
@zeropage sagte in von Matrix Klasse erben:
Wäre schöner, ja. Aber ich habe doch als Matrix in Matrix2D den Typ Array2D. Und um darauf zuzugreifen habe ich matrix() als Rückgabemethode.
https://martinfowler.com/bliki/TellDontAsk.html
Du willst doch eig. nich unbedingt, dass man auf den darunterliegenden Datentypen zugreifen muss, oder?
-
@zeropage sagte in von Matrix Klasse erben:
v.x = i.x * m.matrix[0][0] + i.y * m.matrix[1][0] + i.z * m.matrix[2][0] + i.w * m.matrix[3][0];
Mal eine Frage in die Runde. Hat hier jemand Erfahrungen bezüglich std::fma()?
-
@zeropage sagte in von Matrix Klasse erben:
Eigentlich mache ich auch
(rows, columns)
. Warum das bei meiner Matrix einen anderen Eindruck macht, kann ich jetzt gar nicht erklären. Sieht eine Translationsmatrix in 2D nicht so aus?| 1 0 0 | | 0 1 0 | | X Y 1 |
Ich hab bisher immer mit der transponierten Version von deiner Translationsmatrix gearbeitet, daher meine Verwirrung. Aber das funktioniert genau so gut auch so, deshalb sind deine Vektoren auch Zeilenvektoren (-Matrizen) und du multiplizierst diese von links. Man kann auch mit Spaltenvektoren (-Matrizen) arbeiten - dann multipliziert man von rechts und die Translationsmatrix ist transponiert. Das ist symmetrisch und eigentlich nur eine Sache der Konvention. Die Vektor-Indizes vertauschen (was ja im Endeffekt ein Transponieren ist) sieht da fast genau so aus.
@Finnegan sagte in von Matrix Klasse erben:
Ginge nicht auch einfach
mat(2, 0) = translate.x
?Wäre schöner, ja. Aber ich habe doch als Matrix in
Matrix2D
den TypArray2D
. Und um darauf zuzugreifen habe ichmatrix()
als Rückgabemethode.Ist eigentlich egal wie viele Objekte man da drum herum gepackt hat. Hauptsache das äußere Objekt hat einen
operator()
der den Aufruf z.B. bis zum innersten Objekt durchreicht. Ich denke sowas wird mit Optimierungen ohnehin komplett oder auf höchstens einen Fuktionsaufruf geinlined. Gerade bei Funktionen, die eben nur "durchreichen".
-
@zeropage sagte in von Matrix Klasse erben:
Das hier wäre wohl quick & simple
?
Damit käme man erstmal sehr schnell weiter und würde ich auch so empfehlen wenn du jetzt weniger Drang verspürst, eine möglichst generische Matrixklasse zu perfektionieren.
Du kannst dir ja ein schönes Interface ausdenken, so wie du das nachher alles am liebsten verwenden würdest. Dann kannst du später immer noch eine oder mehr generische Matrixklasse(n) programmieren, die dasselbe Interface zur Verfügung stellen - so musst du dann nur den Matrix-Code und nicht mehr den ganzen Rest deines Programms anfassen.
Hätte auch den Vorteil, dass du später vielleicht besser weisst, was für Operationen du alles brauchst.
-
@Quiche-Lorraine sagte in von Matrix Klasse erben:
@zeropage sagte in von Matrix Klasse erben:
v.x = i.x * m.matrix[0][0] + i.y * m.matrix[1][0] + i.z * m.matrix[2][0] + i.w * m.matrix[3][0];
Mal eine Frage in die Runde. Hat hier jemand Erfahrungen bezüglich std::fma()?
Erfahrung nicht, aber das ist ja dokumentiert. Die Zeile da oben sollte mit
fma
formuliert dann eigentlich so aussehen:v.x = std::fma( i.x, m.matrix[0][0], std::fma( i.y, m.matrix[1][0], std::fma( i.z, m.matrix[2][0], i.w * m.matrix[3][0] ) ) )
... oder etwas weniger geschachtelt:
v.x = std::fma(i.y, m.matrix[1][0], i.x * m.matrix[0][0]) v.x = std::fma(i.z, m.matrix[2][0], v.x) v.x = std::fma(i.w, m.matrix[3][0], v.x)
... oder eben irgendeine äquivalente Formulierung - die genaue Berechnungsreihenfolge kann ja z.B. irgendwann für die numerische Stabilität relevant sein.
Kann man ja mal ausprobieren ob das eventuell besser abschneidet - falls der Compiler da nicht ohnehin schon den selben Code erzeugt, wenn die Optimierungs-Flags richtig gewählt sind.
-
@Finnegan sagte in von Matrix Klasse erben:
Ist eigentlich egal wie viele Objekte man da drum herum gepackt hat. Hauptsache das äußere Objekt hat einen
operator()
der den Aufruf z.B. bis zum innersten Objekt durchreicht. Ich denke sowas wird mit Optimierungen ohnehin komplett oder auf höchstens einen Fuktionsaufruf geinlined. Gerade bei Funktionen, die eben nur "durchreichen".Ja, die vielen durchreichenden Methoden schreibt man ja nur einmal in den Berechnungen. Aber diese sind ja selber in Methoden gepackt, so das die Durchreichungen am Ende gar nicht mehr auftauchen.
Alles was ich hier an Code geschrieben habe, funktioniert natürlich auch. Es ist ja nicht so, das ich keine Matrizen anwenden kann, ich hatte nur nachgedacht, wie ich das generischer schreiben kann.
Bin immer noch hin- und hergerrissen, wie ich das am Ende mache. Habe aber auch gerade eine Woche Pause, also nicht wundern, wenn ich keine konkreten Antworten hatte. Es ist aber immer spannend hier mitzulesen