Rolf b: Einrückungsstil

Beitrag lesen

Bevor Du weiter rumrotzt, lies Dir mal "Clean Code" von Robert Martin durch.

Die Maxime heißt "Do just one thing", und das ist keine Frage der schönen Optik, sondern von Wiederverwendbarkeit und Testbarkeit. Die Methode von Jo verletzt das trotz ihrer Kürze bereits ziemlich - was zu einem enormen Performance-Impact führt. Sie implementiert drei Dinge:

  1. Generieren von Rotationsmatrizen um die X-, Y- und Z-Achse. Dafür sollte man 3 eigene Funktionen bereitstellen
  2. Berechnen des Produkts von zwei Matrizen - eigene Funktion, bitte.
  3. Berechnen des Produkts von einer Matrix mit einem Vektor. Sollte eine eigene Funktion sein, oder man fasst den Vektor als 3x1 Matrix auf und verwendet die Funktion aus Nr. 2.

D.h. man baut Helper wie build_rotX, build_rotY, build_rotZ, mat_multiply und linear_transform und benutzt sie so:

$rxy = mat_multiply(build_rotX($beta), build_rotY($gamma));
$rxyz = mat_multiply($rxy, build_rotZ($delta));

$vRot = linear_transform($rxyz, $vec);

und spätestens jetzt merkt man, dass die Berechnung von $rxyz unabhängig ist von der linearen Transformation von $vec, d.h. wenn man nicht nur einen Vektor transformieren will, sondern hundert, kann man durch diese Aufteilung enorm Zeit sparen.

Ein Tipp noch: Matrizen können außer Rotation auch noch Skalieren und Scheren. Und wenn deine Transformationsmatrizen vierdimensional sind, können sie auch noch verschieben! Allerdings hast Du dann doppelten Rechenaufwand (16 Koeffizienten statt 9, und jeder Koeffizient berechnet sich aus 4 statt 3 Produkten).

Rolf