Ich unterrichte mich selbst in 3D-Mathematik und baue dabei meine eigene rudimentäre Engine (sozusagen). Ich habe mich gefragt, wie ich meine C ++ - Matrixklasse am besten strukturieren kann. Es gibt einige Optionen:
Separate Mitgliedsvariablen:
struct Mat4 { float m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44; // methods }
Ein mehrdimensionales Array:
struct Mat4 { float[4][4] m; // methods }
Ein Array von Vektoren
struct Mat4 { Vec4[4] m; // methods }
Ich vermute, dass es für jeden positive und negative Aspekte geben würde.
Aus 3D Math Primer für Grafik und Spieleentwicklung, 2. Auflage S.155:
Matrizen verwenden 1-basierte Indizes, daher sind die erste Zeile und Spalte mit 1 nummeriert. Beispiel
a12
(lesen Sie „a
eins zwei“, nicht „a
zwölf“) ist das Element in der ersten Zeile und zweiten Spalte. Beachten Sie, dass sich dies von Programmiersprachen wie C ++ und Java unterscheidet, die 0-basierte Array-Indizes verwenden. Eine Matrix hat keine Spalte 0 oder Zeile 0. Dieser Unterschied in der Indizierung kann zu Verwirrung führen, wenn Matrizen unter Verwendung eines tatsächlichen Array-Datentyps gespeichert werden. Aus diesem Grund ist es üblich, dass Klassen, die kleine Matrizen fester Größe des Typs speichern, der für geometrische Zwecke verwendet wird, jedem Element eine eigene benannte Elementvariable zuweisen, z. B.float a11
anstatt die native Array-Unterstützung der Sprache mit etwas wie float zu verwendenelem[3][3]
.
Das ist also eine Stimme für Methode eins.
Ist das wirklich die akzeptierte Art, Dinge zu tun? Es scheint ziemlich unhandlich, wenn der einzige Vorteil darin besteht, an der herkömmlichen mathematischen Notation festzuhalten.
Antworten:
Warum wählen? Sie können beides haben. (Ohne zusätzliche Komplexität der Logik und ohne zusätzlichen Speicherbedarf dank Gewerkschaften.)
quelle