Base: Use nested std::array for Matrix4D class

This commit is contained in:
wmayer
2025-05-13 15:56:20 +02:00
committed by Ladislav Michl
parent 74a22df884
commit abe64f7576
2 changed files with 24 additions and 26 deletions

View File

@@ -35,30 +35,30 @@ using namespace Base;
// clang-format off
Matrix4D::Matrix4D()
: dMtrx4D {{1., 0., 0., 0.},
{0., 1., 0., 0.},
{0., 0., 1., 0.},
{0., 0., 0., 1.}}
: dMtrx4D {{{1., 0., 0., 0.},
{0., 1., 0., 0.},
{0., 0., 1., 0.},
{0., 0., 0., 1.}}}
{}
Matrix4D::Matrix4D(float a11, float a12, float a13, float a14,
float a21, float a22, float a23, float a24,
float a31, float a32, float a33, float a34,
float a41, float a42, float a43, float a44)
: dMtrx4D {{a11, a12, a13, a14},
{a21, a22, a23, a24},
{a31, a32, a33, a34},
{a41, a42, a43, a44}}
: dMtrx4D {{{a11, a12, a13, a14},
{a21, a22, a23, a24},
{a31, a32, a33, a34},
{a41, a42, a43, a44}}}
{}
Matrix4D::Matrix4D(double a11, double a12, double a13, double a14,
double a21, double a22, double a23, double a24,
double a31, double a32, double a33, double a34,
double a41, double a42, double a43, double a44)
: dMtrx4D {{a11, a12, a13, a14},
{a21, a22, a23, a24},
{a31, a32, a33, a34},
{a41, a42, a43, a44}}
: dMtrx4D {{{a11, a12, a13, a14},
{a21, a22, a23, a24},
{a31, a32, a33, a34},
{a41, a42, a43, a44}}}
{}
// clang-format on
@@ -700,15 +700,12 @@ void Matrix4D::Print() const
void Matrix4D::transpose()
{
double dNew[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
dNew[j][i] = dMtrx4D[i][j];
}
}
memcpy(dMtrx4D, dNew, sizeof(dMtrx4D));
std::swap(dMtrx4D[0][1], dMtrx4D[1][0]);
std::swap(dMtrx4D[0][2], dMtrx4D[2][0]);
std::swap(dMtrx4D[0][3], dMtrx4D[3][0]);
std::swap(dMtrx4D[1][2], dMtrx4D[2][1]);
std::swap(dMtrx4D[1][3], dMtrx4D[3][1]);
std::swap(dMtrx4D[2][3], dMtrx4D[3][2]);
}

View File

@@ -106,9 +106,9 @@ public:
/// Comparison
inline bool operator==(const Matrix4D& mat) const;
/// Index operator
inline double* operator[](unsigned int usNdx);
inline std::array<double, 4>& operator[](unsigned int usNdx);
/// Index operator
inline const double* operator[](unsigned int usNdx) const;
inline const std::array<double, 4>& operator[](unsigned int usNdx) const;
/// Get vector of row
inline Vector3d getRow(unsigned int usNdx) const;
/// Get vector of column
@@ -234,7 +234,8 @@ public:
void fromString(const std::string& str);
private:
double dMtrx4D[4][4];
using Array2d = std::array<std::array<double, 4>, 4>;
Array2d dMtrx4D;
};
inline Matrix4D Matrix4D::operator+(const Matrix4D& mat) const
@@ -386,12 +387,12 @@ inline Vector3f& operator*=(Vector3f& vec, const Matrix4D& mat)
return vec;
}
inline double* Matrix4D::operator[](unsigned int usNdx)
inline std::array<double, 4>& Matrix4D::operator[](unsigned int usNdx)
{
return dMtrx4D[usNdx];
}
inline const double* Matrix4D::operator[](unsigned int usNdx) const
inline const std::array<double, 4>& Matrix4D::operator[](unsigned int usNdx) const
{
return dMtrx4D[usNdx];
}