📄 imathmatrix.h
字号:
/////////////////////////////////////////////////////////////////////////////// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas// Digital Ltd. LLC// // All rights reserved.// // Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met:// * Redistributions of source code must retain the above copyright// notice, this list of conditions and the following disclaimer.// * Redistributions in binary form must reproduce the above// copyright notice, this list of conditions and the following disclaimer// in the documentation and/or other materials provided with the// distribution.// * Neither the name of Industrial Light & Magic nor the names of// its contributors may be used to endorse or promote products derived// from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE./////////////////////////////////////////////////////////////////////////////#ifndef INCLUDED_IMATHMATRIX_H#define INCLUDED_IMATHMATRIX_H//----------------------------------------------------------------//// 2D (3x3) and 3D (4x4) transformation matrix templates.////----------------------------------------------------------------#include "ImathPlatform.h"#include "ImathFun.h"#include "ImathExc.h"#include "ImathVec.h"#include "ImathShear.h"#include <iostream>#include <iomanip>#if (defined _WIN32 || defined _WIN64) && defined _MSC_VER// suppress exception specification warnings#pragma warning(disable:4290)#endifnamespace Imath {template <class T> class Matrix33{ public: //------------------- // Access to elements //------------------- T x[3][3]; T * operator [] (int i); const T * operator [] (int i) const; //------------- // Constructors //------------- Matrix33 (); // 1 0 0 // 0 1 0 // 0 0 1 Matrix33 (T a); // a a a // a a a // a a a Matrix33 (const T a[3][3]); // a[0][0] a[0][1] a[0][2] // a[1][0] a[1][1] a[1][2] // a[2][0] a[2][1] a[2][2] Matrix33 (T a, T b, T c, T d, T e, T f, T g, T h, T i); // a b c // d e f // g h i //-------------------------------- // Copy constructor and assignment //-------------------------------- Matrix33 (const Matrix33 &v); const Matrix33 & operator = (const Matrix33 &v); const Matrix33 & operator = (T a); //---------------------- // Compatibility with Sb //---------------------- T * getValue (); const T * getValue () const; template <class S> void getValue (Matrix33<S> &v) const; template <class S> Matrix33 & setValue (const Matrix33<S> &v); template <class S> Matrix33 & setTheMatrix (const Matrix33<S> &v); //--------- // Identity //--------- void makeIdentity(); //--------- // Equality //--------- bool operator == (const Matrix33 &v) const; bool operator != (const Matrix33 &v) const; //----------------------------------------------------------------------- // Compare two matrices and test if they are "approximately equal": // // equalWithAbsError (m, e) // // Returns true if the coefficients of this and m are the same with // an absolute error of no more than e, i.e., for all i, j // // abs (this[i][j] - m[i][j]) <= e // // equalWithRelError (m, e) // // Returns true if the coefficients of this and m are the same with // a relative error of no more than e, i.e., for all i, j // // abs (this[i] - v[i][j]) <= e * abs (this[i][j]) //----------------------------------------------------------------------- bool equalWithAbsError (const Matrix33<T> &v, T e) const; bool equalWithRelError (const Matrix33<T> &v, T e) const; //------------------------ // Component-wise addition //------------------------ const Matrix33 & operator += (const Matrix33 &v); const Matrix33 & operator += (T a); Matrix33 operator + (const Matrix33 &v) const; //--------------------------- // Component-wise subtraction //--------------------------- const Matrix33 & operator -= (const Matrix33 &v); const Matrix33 & operator -= (T a); Matrix33 operator - (const Matrix33 &v) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Matrix33 operator - () const; const Matrix33 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Matrix33 & operator *= (T a); Matrix33 operator * (T a) const; //----------------------------------- // Matrix-times-matrix multiplication //----------------------------------- const Matrix33 & operator *= (const Matrix33 &v); Matrix33 operator * (const Matrix33 &v) const; //--------------------------------------------- // Vector-times-matrix multiplication; see also // the "operator *" functions defined below. //--------------------------------------------- template <class S> void multVecMatrix(const Vec2<S> &src, Vec2<S> &dst) const; template <class S> void multDirMatrix(const Vec2<S> &src, Vec2<S> &dst) const; //------------------------ // Component-wise division //------------------------ const Matrix33 & operator /= (T a); Matrix33 operator / (T a) const; //------------------ // Transposed matrix //------------------ const Matrix33 & transpose (); Matrix33 transposed () const; //------------------------------------------------------------ // Inverse matrix: If singExc is false, inverting a singular // matrix produces an identity matrix. If singExc is true, // inverting a singular matrix throws a SingMatrixExc. // // inverse() and invert() invert matrices using determinants; // gjInverse() and gjInvert() use the Gauss-Jordan method. // // inverse() and invert() are significantly faster than // gjInverse() and gjInvert(), but the results may be slightly // less accurate. // //------------------------------------------------------------ const Matrix33 & invert (bool singExc = false) throw (Iex::MathExc); Matrix33<T> inverse (bool singExc = false) const throw (Iex::MathExc); const Matrix33 & gjInvert (bool singExc = false) throw (Iex::MathExc); Matrix33<T> gjInverse (bool singExc = false) const throw (Iex::MathExc); //----------------------------------------- // Set matrix to rotation by r (in radians) //----------------------------------------- template <class S> const Matrix33 & setRotation (S r); //----------------------------- // Rotate the given matrix by r //----------------------------- template <class S> const Matrix33 & rotate (S r); //-------------------------------------------- // Set matrix to scale by given uniform factor //-------------------------------------------- const Matrix33 & setScale (T s); //------------------------------------ // Set matrix to scale by given vector //------------------------------------ template <class S> const Matrix33 & setScale (const Vec2<S> &s); //---------------------- // Scale the matrix by s //---------------------- template <class S> const Matrix33 & scale (const Vec2<S> &s); //------------------------------------------ // Set matrix to translation by given vector //------------------------------------------ template <class S> const Matrix33 & setTranslation (const Vec2<S> &t); //----------------------------- // Return translation component //----------------------------- Vec2<T> translation () const; //-------------------------- // Translate the matrix by t //-------------------------- template <class S> const Matrix33 & translate (const Vec2<S> &t); //----------------------------------------------------------- // Set matrix to shear x for each y coord. by given factor xy //----------------------------------------------------------- template <class S> const Matrix33 & setShear (const S &h); //------------------------------------------------------------- // Set matrix to shear x for each y coord. by given factor h[0] // and to shear y for each x coord. by given factor h[1] //------------------------------------------------------------- template <class S> const Matrix33 & setShear (const Vec2<S> &h); //----------------------------------------------------------- // Shear the matrix in x for each y coord. by given factor xy //----------------------------------------------------------- template <class S> const Matrix33 & shear (const S &xy); //----------------------------------------------------------- // Shear the matrix in x for each y coord. by given factor xy // and shear y for each x coord. by given factor yx //----------------------------------------------------------- template <class S> const Matrix33 & shear (const Vec2<S> &h); //------------------------------------------------- // Limitations of type T (see also class limits<T>) //------------------------------------------------- static T baseTypeMin() {return limits<T>::min();} static T baseTypeMax() {return limits<T>::max();} static T baseTypeSmallest() {return limits<T>::smallest();} static T baseTypeEpsilon() {return limits<T>::epsilon();}};template <class T> class Matrix44{ public: //------------------- // Access to elements //------------------- T x[4][4]; T * operator [] (int i); const T * operator [] (int i) const; //------------- // Constructors //------------- Matrix44 (); // 1 0 0 0 // 0 1 0 0 // 0 0 1 0 // 0 0 0 1 Matrix44 (T a); // a a a a // a a a a // a a a a // a a a a Matrix44 (const T a[4][4]) ; // a[0][0] a[0][1] a[0][2] a[0][3] // a[1][0] a[1][1] a[1][2] a[1][3] // a[2][0] a[2][1] a[2][2] a[2][3] // a[3][0] a[3][1] a[3][2] a[3][3] Matrix44 (T a, T b, T c, T d, T e, T f, T g, T h, T i, T j, T k, T l, T m, T n, T o, T p); // a b c d // e f g h // i j k l // m n o p Matrix44 (Matrix33<T> r, Vec3<T> t); // r r r 0 // r r r 0 // r r r 0 // t t t 1 //-------------------------------- // Copy constructor and assignment //-------------------------------- Matrix44 (const Matrix44 &v); const Matrix44 & operator = (const Matrix44 &v); const Matrix44 & operator = (T a); //---------------------- // Compatibility with Sb //---------------------- T * getValue (); const T * getValue () const; template <class S> void getValue (Matrix44<S> &v) const; template <class S> Matrix44 & setValue (const Matrix44<S> &v); template <class S> Matrix44 & setTheMatrix (const Matrix44<S> &v); //--------- // Identity //--------- void makeIdentity(); //--------- // Equality //--------- bool operator == (const Matrix44 &v) const; bool operator != (const Matrix44 &v) const; //----------------------------------------------------------------------- // Compare two matrices and test if they are "approximately equal": // // equalWithAbsError (m, e) // // Returns true if the coefficients of this and m are the same with // an absolute error of no more than e, i.e., for all i, j // // abs (this[i][j] - m[i][j]) <= e // // equalWithRelError (m, e) // // Returns true if the coefficients of this and m are the same with // a relative error of no more than e, i.e., for all i, j // // abs (this[i] - v[i][j]) <= e * abs (this[i][j]) //----------------------------------------------------------------------- bool equalWithAbsError (const Matrix44<T> &v, T e) const; bool equalWithRelError (const Matrix44<T> &v, T e) const; //------------------------ // Component-wise addition //------------------------ const Matrix44 & operator += (const Matrix44 &v); const Matrix44 & operator += (T a); Matrix44 operator + (const Matrix44 &v) const; //--------------------------- // Component-wise subtraction //--------------------------- const Matrix44 & operator -= (const Matrix44 &v); const Matrix44 & operator -= (T a); Matrix44 operator - (const Matrix44 &v) const; //------------------------------------ // Component-wise multiplication by -1 //------------------------------------ Matrix44 operator - () const; const Matrix44 & negate (); //------------------------------ // Component-wise multiplication //------------------------------ const Matrix44 & operator *= (T a); Matrix44 operator * (T a) const; //----------------------------------- // Matrix-times-matrix multiplication //----------------------------------- const Matrix44 & operator *= (const Matrix44 &v); Matrix44 operator * (const Matrix44 &v) const; static void multiply (const Matrix44 &a, // assumes that const Matrix44 &b, // &a != &c and Matrix44 &c); // &b != &c. //--------------------------------------------- // Vector-times-matrix multiplication; see also // the "operator *" functions defined below. //--------------------------------------------- template <class S> void multVecMatrix(const Vec3<S> &src, Vec3<S> &dst) const; template <class S> void multDirMatrix(const Vec3<S> &src, Vec3<S> &dst) const; //------------------------ // Component-wise division //------------------------ const Matrix44 & operator /= (T a); Matrix44 operator / (T a) const; //------------------ // Transposed matrix //------------------ const Matrix44 & transpose (); Matrix44 transposed () const; //------------------------------------------------------------ // Inverse matrix: If singExc is false, inverting a singular // matrix produces an identity matrix. If singExc is true, // inverting a singular matrix throws a SingMatrixExc. // // inverse() and invert() invert matrices using determinants; // gjInverse() and gjInvert() use the Gauss-Jordan method. // // inverse() and invert() are significantly faster than // gjInverse() and gjInvert(), but the results may be slightly // less accurate. // //------------------------------------------------------------ const Matrix44 & invert (bool singExc = false) throw (Iex::MathExc); Matrix44<T> inverse (bool singExc = false) const throw (Iex::MathExc); const Matrix44 & gjInvert (bool singExc = false) throw (Iex::MathExc); Matrix44<T> gjInverse (bool singExc = false) const throw (Iex::MathExc); //-------------------------------------------------------- // Set matrix to rotation by XYZ euler angles (in radians) //-------------------------------------------------------- template <class S> const Matrix44 & setEulerAngles (const Vec3<S>& r); //-------------------------------------------------------- // Set matrix to rotation around given axis by given angle //-------------------------------------------------------- template <class S> const Matrix44 & setAxisAngle (const Vec3<S>& ax, S ang); //------------------------------------------- // Rotate the matrix by XYZ euler angles in r //------------------------------------------- template <class S> const Matrix44 & rotate (const Vec3<S> &r); //-------------------------------------------- // Set matrix to scale by given uniform factor //-------------------------------------------- const Matrix44 & setScale (T s); //------------------------------------ // Set matrix to scale by given vector //------------------------------------ template <class S> const Matrix44 & setScale (const Vec3<S> &s);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -