123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- #pragma once
- #include <Mathematics/Matrix.h>
- #include <Mathematics/GaussianElimination.h>
- namespace WwiseGTE
- {
- template <int N, typename Real>
- class ConvertCoordinates
- {
- public:
-
-
- ConvertCoordinates()
- :
- mIsVectorOnRightU(true),
- mIsVectorOnRightV(true),
- mIsRightHandedU(true),
- mIsRightHandedV(true)
- {
- mC.MakeIdentity();
- mInverseC.MakeIdentity();
- }
-
-
-
-
-
-
- bool operator()(
- Matrix<N, N, Real> const& U, bool vectorOnRightU,
- Matrix<N, N, Real> const& V, bool vectorOnRightV)
- {
-
- mC.MakeIdentity();
- mInverseC.MakeIdentity();
- mIsVectorOnRightU = true;
- mIsVectorOnRightV = true;
- mIsRightHandedU = true;
- mIsRightHandedV = true;
- Matrix<N, N, Real> inverseU;
- Real determinantU;
- bool invertibleU = GaussianElimination<Real>()(N, &U[0], &inverseU[0],
- determinantU, nullptr, nullptr, nullptr, 0, nullptr);
- if (!invertibleU)
- {
- return false;
- }
- Matrix<N, N, Real> inverseV;
- Real determinantV;
- bool invertibleV = GaussianElimination<Real>()(N, &V[0], &inverseV[0],
- determinantV, nullptr, nullptr, nullptr, 0, nullptr);
- if (!invertibleV)
- {
- return false;
- }
- mC = inverseU * V;
- mInverseC = inverseV * U;
- mIsVectorOnRightU = vectorOnRightU;
- mIsVectorOnRightV = vectorOnRightV;
- mIsRightHandedU = (determinantU > (Real)0);
- mIsRightHandedV = (determinantV > (Real)0);
- return true;
- }
-
- inline Matrix<N, N, Real> const& GetC() const
- {
- return mC;
- }
- inline Matrix<N, N, Real> const& GetInverseC() const
- {
- return mInverseC;
- }
- inline bool IsVectorOnRightU() const
- {
- return mIsVectorOnRightU;
- }
- inline bool IsVectorOnRightV() const
- {
- return mIsVectorOnRightV;
- }
- inline bool IsRightHandedU() const
- {
- return mIsRightHandedU;
- }
- inline bool IsRightHandedV() const
- {
- return mIsRightHandedV;
- }
-
-
-
-
-
- inline Vector<N, Real> UToV(Vector<N, Real> const& X) const
- {
- return mInverseC * X;
- }
-
- inline Vector<N, Real> VToU(Vector<N, Real> const& Y) const
- {
- return mC * Y;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- Matrix<N, N, Real> UToV(Matrix<N, N, Real> const& A) const
- {
- Matrix<N, N, Real> product;
- if (mIsVectorOnRightU)
- {
- product = mInverseC * A * mC;
- if (mIsVectorOnRightV)
- {
- return product;
- }
- else
- {
- return Transpose(product);
- }
- }
- else
- {
- product = mInverseC * MultiplyATB(A, mC);
- if (mIsVectorOnRightV)
- {
- return product;
- }
- else
- {
- return Transpose(product);
- }
- }
- }
-
-
-
-
-
-
- Matrix<N, N, Real> VToU(Matrix<N, N, Real> const& B) const
- {
-
-
-
-
-
-
- Matrix<N, N, Real> product;
- if (mIsVectorOnRightV)
- {
- product = mC * B * mInverseC;
- if (mIsVectorOnRightU)
- {
- return product;
- }
- else
- {
- return Transpose(product);
- }
- }
- else
- {
- product = mC * MultiplyATB(B, mInverseC);
- if (mIsVectorOnRightU)
- {
- return product;
- }
- else
- {
- return Transpose(product);
- }
- }
- }
- private:
-
- Matrix<N, N, Real> mC, mInverseC;
- bool mIsVectorOnRightU, mIsVectorOnRightV;
- bool mIsRightHandedU, mIsRightHandedV;
- };
- }
|