mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-30 20:15:35 +08:00
81 lines
3.5 KiB
C++
81 lines
3.5 KiB
C++
/* Copyright (C) 2013 VATSIM Community / contributors
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "blackmisc/mathmatrix3x3.h"
|
|
|
|
namespace BlackMisc
|
|
{
|
|
namespace Math
|
|
{
|
|
|
|
/*
|
|
* Determinant
|
|
*/
|
|
double CMatrix3x3::determinant() const
|
|
{
|
|
return
|
|
this->m_matrix(0, 0) * this->m_matrix(1, 1) * this->m_matrix(2, 2) +
|
|
this->m_matrix(0, 1) * this->m_matrix(1, 2) * this->m_matrix(2, 0) +
|
|
this->m_matrix(0, 2) * this->m_matrix(1, 0) * this->m_matrix(2, 1) -
|
|
this->m_matrix(0, 1) * this->m_matrix(1, 0) * this->m_matrix(2, 2) -
|
|
this->m_matrix(0, 2) * this->m_matrix(1, 1) * this->m_matrix(2, 0) -
|
|
this->m_matrix(0, 0) * this->m_matrix(1, 2) * this->m_matrix(2, 1);
|
|
}
|
|
|
|
/*
|
|
* Inverse
|
|
*/
|
|
CMatrix3x3 CMatrix3x3::inverse(bool &o_invertible) const
|
|
{
|
|
CMatrix3x3 inverse;
|
|
double det = this->determinant();
|
|
if (det == 0)
|
|
{
|
|
o_invertible = false;
|
|
inverse.setZero();
|
|
return inverse;
|
|
}
|
|
double invdet = 1.0 / det;
|
|
|
|
inverse.m_matrix(0, 0) = (this->m_matrix(1, 1) * this->m_matrix(2, 2) - this->m_matrix(1, 2) * this->m_matrix(2, 1)) * invdet;
|
|
inverse.m_matrix(0, 1) = (- this->m_matrix(0, 1) * this->m_matrix(2, 2) + this->m_matrix(0, 2) * this->m_matrix(2, 1)) * invdet;
|
|
inverse.m_matrix(0, 2) = (this->m_matrix(0, 1) * this->m_matrix(1, 2) - this->m_matrix(0, 2) * this->m_matrix(1, 1)) * invdet;
|
|
inverse.m_matrix(1, 0) = (- this->m_matrix(1, 0) * this->m_matrix(2, 2) + this->m_matrix(1, 2) * this->m_matrix(2, 0)) * invdet;
|
|
inverse.m_matrix(1, 1) = (this->m_matrix(0, 0) * this->m_matrix(2, 2) - this->m_matrix(0, 2) * this->m_matrix(2, 0)) * invdet;
|
|
inverse.m_matrix(1, 2) = (- this->m_matrix(0, 0) * this->m_matrix(1, 2) + this->m_matrix(0, 2) * this->m_matrix(1, 0)) * invdet;
|
|
inverse.m_matrix(2, 0) = (this->m_matrix(1, 0) * this->m_matrix(2, 1) - this->m_matrix(1, 1) * this->m_matrix(2, 0)) * invdet;
|
|
inverse.m_matrix(2, 1) = (- this->m_matrix(0, 0) * this->m_matrix(2, 1) + this->m_matrix(0, 1) * this->m_matrix(2, 0)) * invdet;
|
|
inverse.m_matrix(2, 2) = (this->m_matrix(0, 0) * this->m_matrix(1, 1) - this->m_matrix(0, 1) * this->m_matrix(1, 0)) * invdet;
|
|
|
|
o_invertible = true;
|
|
return inverse;
|
|
}
|
|
|
|
/*
|
|
* Get a row
|
|
*/
|
|
CMatrix1x3 CMatrix3x3::getRow(int row) const
|
|
{
|
|
bool valid = row >= 0 && row <= 3;
|
|
Q_ASSERT_X(valid, "getRow", "invalid row");
|
|
if (!valid) throw std::range_error("invalid row");
|
|
return CMatrix1x3(this->getElement(row, 0), this->getElement(row, 1), this->getElement(row, 2));
|
|
}
|
|
|
|
/*
|
|
* Get a column
|
|
*/
|
|
CMatrix3x1 CMatrix3x3::getColumn(int column) const
|
|
{
|
|
bool valid = column >= 0 && column <= 3;
|
|
Q_ASSERT_X(valid, "getColumn", "invalid column");
|
|
if (!valid) throw new std::range_error("invalid column");
|
|
return CMatrix3x1(this->getElement(0, column), this->getElement(1, column), this->getElement(2, column));
|
|
}
|
|
|
|
|
|
} // namespace
|
|
} // namespace
|