1 #ifndef ACG_MATH_MATRIX3X3T_HH_ 2 #define ACG_MATH_MATRIX3X3T_HH_ 6 #include <ACG/Math/VectorT.hh> 11 #if defined(_MSC_VER) && _MSC_VER < 1900 13 typedef unsigned char uint_fast8_t;
21 template<
typename Scalar>
65 values_(
std::move(row_major)) {}
67 constexpr
bool operator==(
const Matrix3x3T &rhs)
const {
68 return values_ == rhs.values_;
77 constexpr
static uint_fast8_t
indexof(uint_fast8_t r, uint_fast8_t c) {
81 constexpr
const Scalar &operator() (uint_fast8_t r, uint_fast8_t c)
const {
85 Scalar &operator() (uint_fast8_t r, uint_fast8_t c) {
90 constexpr
const Scalar &
operator[] (uint_fast8_t i)
const {
99 Vec3 getRow(uint_fast8_t r)
const {
100 return Vec3((*
this)(r,0), (*
this)(r,1), (*
this)(r,2));
102 void setRow(uint_fast8_t r,
const Vec3 &v) {
103 for (uint_fast8_t c = 0; c < 3; ++c) {
104 (*this)(r, c) = v[c];
107 Vec3 getCol(uint_fast8_t c)
const {
108 return Vec3((*
this)(0,c), (*
this)(1,c), (*
this)(2,c));
110 void setCol(uint_fast8_t c,
const Vec3 &v) {
111 for (uint_fast8_t r = 0; r < 3; ++r) {
112 (*this)(r, c) = v[r];
118 (*this)(0, 0) * rhs(0, 0) + (*this)(0, 1) * rhs(1, 0) + (*this)(0, 2) * rhs(2, 0),
119 (*this)(0, 0) * rhs(0, 1) + (*this)(0, 1) * rhs(1, 1) + (*this)(0, 2) * rhs(2, 1),
120 (*this)(0, 0) * rhs(0, 2) + (*this)(0, 1) * rhs(1, 2) + (*this)(0, 2) * rhs(2, 2),
122 (*this)(1, 0) * rhs(0, 0) + (*this)(1, 1) * rhs(1, 0) + (*this)(1, 2) * rhs(2, 0),
123 (*this)(1, 0) * rhs(0, 1) + (*this)(1, 1) * rhs(1, 1) + (*this)(1, 2) * rhs(2, 1),
124 (*this)(1, 0) * rhs(0, 2) + (*this)(1, 1) * rhs(1, 2) + (*this)(1, 2) * rhs(2, 2),
126 (*this)(2, 0) * rhs(0, 0) + (*this)(2, 1) * rhs(1, 0) + (*this)(2, 2) * rhs(2, 0),
127 (*this)(2, 0) * rhs(0, 1) + (*this)(2, 1) * rhs(1, 1) + (*this)(2, 2) * rhs(2, 1),
128 (*this)(2, 0) * rhs(0, 2) + (*this)(2, 1) * rhs(1, 2) + (*this)(2, 2) * rhs(2, 2),
132 template<
typename OtherScalar>
137 (*this)(0, 0) * rhs[0] + (*
this)(0, 1) * rhs[1] + (*
this)(0, 2) * rhs[2],
138 (*
this)(1, 0) * rhs[0] + (*
this)(1, 1) * rhs[1] + (*
this)(1, 2) * rhs[2],
139 (*
this)(2, 0) * rhs[0] + (*
this)(2, 1) * rhs[1] + (*
this)(2, 2) * rhs[2]
143 template<
typename OtherScalar>
148 rhs(0, 0) * v[0] + rhs(0, 1) * v[1] + rhs(0, 2) * v[2],
149 rhs(1, 0) * v[0] + rhs(1, 1) * v[1] + rhs(1, 2) * v[2],
150 rhs(2, 0) * v[0] + rhs(2, 1) * v[1] + rhs(2, 2) * v[2]
154 constexpr
Matrix3x3T operator*(Scalar c)
const {
156 (*this)[0] * c, (*this)[1] * c, (*this)[2] * c,
157 (*this)[3] * c, (*this)[4] * c, (*this)[5] * c,
158 (*this)[6] * c, (*this)[7] * c, (*this)[8] * c,
164 rhs[0] * c, rhs[1] * c, rhs[2] * c,
165 rhs[3] * c, rhs[4] * c, rhs[5] * c,
166 rhs[6] * c, rhs[7] * c, rhs[8] * c,
172 (*this)[0] + rhs[0], (*this)[1] + rhs[1], (*this)[2] + rhs[2],
173 (*this)[3] + rhs[3], (*this)[4] + rhs[4], (*this)[5] + rhs[5],
174 (*this)[6] + rhs[6], (*this)[7] + rhs[7], (*this)[8] + rhs[8],
180 (*this)[0] - rhs[0], (*this)[1] - rhs[1], (*this)[2] - rhs[2],
181 (*this)[3] - rhs[3], (*this)[4] - rhs[4], (*this)[5] - rhs[5],
182 (*this)[6] - rhs[6], (*this)[7] - rhs[7], (*this)[8] - rhs[8],
188 -values_[0], -values_[1], -values_[2],
189 -values_[3], -values_[4], -values_[5],
190 -values_[6], -values_[7], -values_[8]
195 (*this) = operator*(rhs);
199 constexpr Scalar det()
const {
200 return (*
this)(0, 0) * ((*
this)(1, 1) * (*
this)(2, 2) - (*
this)(2, 1) * (*
this)(1, 2)) -
201 (*this)(0, 1) * ((*
this)(1, 0) * (*
this)(2, 2) - (*
this)(1, 2) * (*
this)(2, 0)) +
202 (*this)(0, 2) * ((*
this)(1, 0) * (*
this)(2, 1) - (*
this)(1, 1) * (*
this)(2, 0));
214 constexpr Scalar trace()
const {
215 return (*
this)[0] + (*this)[4] + (*this)[8];
219 std::swap(values_[1], values_[3]);
220 std::swap(values_[2], values_[6]);
221 std::swap(values_[5], values_[7]);
226 values_[0], values_[3], values_[6],
227 values_[1], values_[4], values_[7],
228 values_[2], values_[5], values_[8],
237 const Scalar invdet = 1.0 / det();
239 ((*this)(1, 1) * (*
this)(2, 2) - (*
this)(2, 1) * (*
this)(1, 2)) * invdet,
240 ((*this)(0, 2) * (*
this)(2, 1) - (*
this)(0, 1) * (*
this)(2, 2)) * invdet,
241 ((*this)(0, 1) * (*
this)(1, 2) - (*
this)(0, 2) * (*
this)(1, 1)) * invdet,
242 ((*this)(1, 2) * (*
this)(2, 0) - (*
this)(1, 0) * (*
this)(2, 2)) * invdet,
243 ((*this)(0, 0) * (*
this)(2, 2) - (*
this)(0, 2) * (*
this)(2, 0)) * invdet,
244 ((*this)(1, 0) * (*
this)(0, 2) - (*
this)(0, 0) * (*
this)(1, 2)) * invdet,
245 ((*this)(1, 0) * (*
this)(2, 1) - (*
this)(2, 0) * (*
this)(1, 1)) * invdet,
246 ((*this)(2, 0) * (*
this)(0, 1) - (*
this)(0, 0) * (*
this)(2, 1)) * invdet,
247 ((*this)(0, 0) * (*
this)(1, 1) - (*
this)(1, 0) * (*
this)(0, 1)) * invdet,
251 constexpr Scalar frobeniusSquared()
const {
252 return std::inner_product(
253 values_.begin(), values_.end(), values_.begin(), Scalar(0.0));
256 constexpr
double frobenius()
const {
257 return std::sqrt(frobeniusSquared());
262 std::ostream &operator<< (std::ostream &os,
const Matrix3x3T &m) {
263 os <<
"[[" << m[0] <<
", " << m[1] <<
", " << m[2] <<
"], " 264 "[" << m[3] <<
", " << m[4] <<
", " << m[5] <<
"], " 265 "[" << m[6] <<
", " << m[7] <<
", " << m[8] <<
"]]";
270 std::array<Scalar, 9> values_;
278 #if defined(_MSC_VER) && _MSC_VER < 1900
static constexpr uint_fast8_t indexof(uint_fast8_t r, uint_fast8_t c)
Map row/column index to linearized index.
Namespace providing different geometric functions concerning angles.
constexpr const Scalar & operator[](uint_fast8_t i) const
Linearized row major access.
constexpr Matrix3x3T(std::array< Scalar, 9 > row_major)