Main Page | Namespace List | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Matrix44Operation.cpp

Go to the documentation of this file.
00001 
00008 #include "PS2Math.h"
00009 
00010 using namespace PS2Math;
00011 
00026 Matrix44 &PS2Math::Matrix44Multiply(const Matrix44 &M1, 
00027                                                 const Matrix44 &M2, 
00028                                                         Matrix44 &Result) {
00029 
00030     Result.elem[0][0] = M1.elem[0][0] * M2.elem[0][0] + M1.elem[0][1] * M2.elem[1][0] + M1.elem[0][2] * M2.elem[2][0] + M1.elem[0][3] * M2.elem[3][0];
00031     Result.elem[0][1] = M1.elem[0][0] * M2.elem[0][1] + M1.elem[0][1] * M2.elem[1][1] + M1.elem[0][2] * M2.elem[2][1] + M1.elem[0][3] * M2.elem[3][1];
00032     Result.elem[0][2] = M1.elem[0][0] * M2.elem[0][2] + M1.elem[0][1] * M2.elem[1][2] + M1.elem[0][2] * M2.elem[2][2] + M1.elem[0][3] * M2.elem[3][2];
00033     Result.elem[0][3] = M1.elem[0][0] * M2.elem[0][3] + M1.elem[0][1] * M2.elem[1][3] + M1.elem[0][2] * M2.elem[2][3] + M1.elem[0][3] * M2.elem[3][3];
00034     
00035     Result.elem[1][0] = M1.elem[1][0] * M2.elem[0][0] + M1.elem[1][1] * M2.elem[1][0] + M1.elem[1][2] * M2.elem[2][0] + M1.elem[1][3] * M2.elem[3][0];
00036     Result.elem[1][1] = M1.elem[1][0] * M2.elem[0][1] + M1.elem[1][1] * M2.elem[1][1] + M1.elem[1][2] * M2.elem[2][1] + M1.elem[1][3] * M2.elem[3][1];
00037     Result.elem[1][2] = M1.elem[1][0] * M2.elem[0][2] + M1.elem[1][1] * M2.elem[1][2] + M1.elem[1][2] * M2.elem[2][2] + M1.elem[1][3] * M2.elem[3][2];
00038     Result.elem[1][3] = M1.elem[1][0] * M2.elem[0][3] + M1.elem[1][1] * M2.elem[1][3] + M1.elem[1][2] * M2.elem[2][3] + M1.elem[1][3] * M2.elem[3][3];
00039 
00040     Result.elem[2][0] = M1.elem[2][0] * M2.elem[0][0] + M1.elem[2][1] * M2.elem[1][0] + M1.elem[2][2] * M2.elem[2][0] + M1.elem[2][3] * M2.elem[3][0];
00041     Result.elem[2][1] = M1.elem[2][0] * M2.elem[0][1] + M1.elem[2][1] * M2.elem[1][1] + M1.elem[2][2] * M2.elem[2][1] + M1.elem[2][3] * M2.elem[3][1];
00042     Result.elem[2][2] = M1.elem[2][0] * M2.elem[0][2] + M1.elem[2][1] * M2.elem[1][2] + M1.elem[2][2] * M2.elem[2][2] + M1.elem[2][3] * M2.elem[3][2];
00043     Result.elem[2][3] = M1.elem[2][0] * M2.elem[0][3] + M1.elem[2][1] * M2.elem[1][3] + M1.elem[2][2] * M2.elem[2][3] + M1.elem[2][3] * M2.elem[3][3];
00044 
00045     Result.elem[3][0] = M1.elem[3][0] * M2.elem[0][0] + M1.elem[3][1] * M2.elem[1][0] + M1.elem[3][2] * M2.elem[2][0] + M1.elem[3][3] * M2.elem[3][0];
00046     Result.elem[3][1] = M1.elem[3][0] * M2.elem[0][1] + M1.elem[3][1] * M2.elem[1][1] + M1.elem[3][2] * M2.elem[2][1] + M1.elem[3][3] * M2.elem[3][1];
00047     Result.elem[3][2] = M1.elem[3][0] * M2.elem[0][2] + M1.elem[3][1] * M2.elem[1][2] + M1.elem[3][2] * M2.elem[2][2] + M1.elem[3][3] * M2.elem[3][2];
00048     Result.elem[3][3] = M1.elem[3][0] * M2.elem[0][3] + M1.elem[3][1] * M2.elem[1][3] + M1.elem[3][2] * M2.elem[2][3] + M1.elem[3][3] * M2.elem[3][3];
00049 
00050     return Result;
00051 }
00052 
00053 /* .
00054     This version of the Matrix44 Multiplication is used to do operation such 
00055     M1 = M1 * M2, normal version of the function does not use a temporary object so 
00056     it cannot be used. This version of the function execute operation M1 * M2 and
00057     store the result in the left operand (M1). This is the reason for suffix L
00058     (Left) in his name.
00059     @param M1 Left matrix involved into the operation
00060     @param M2 Right matrix involved into the operation
00061     @return A reference to the left matrix (first parameter) 
00062 */
00063 Matrix44 &PS2Math::Matrix44MultiplyL(Matrix44 &M1_result, 
00064                                          const Matrix44 &M2) {
00065 
00066     Matrix44 Temp;
00067     Temp.elem[0][0] = M1_result.elem[0][0] * M2.elem[0][0] + M1_result.elem[0][1] * M2.elem[1][0] + M1_result.elem[0][2] * M2.elem[2][0] + M1_result.elem[0][3] * M2.elem[3][0];
00068     Temp.elem[0][1] = M1_result.elem[0][0] * M2.elem[0][1] + M1_result.elem[0][1] * M2.elem[1][1] + M1_result.elem[0][2] * M2.elem[2][1] + M1_result.elem[0][3] * M2.elem[3][1];
00069     Temp.elem[0][2] = M1_result.elem[0][0] * M2.elem[0][2] + M1_result.elem[0][1] * M2.elem[1][2] + M1_result.elem[0][2] * M2.elem[2][2] + M1_result.elem[0][3] * M2.elem[3][2];
00070     Temp.elem[0][3] = M1_result.elem[0][0] * M2.elem[0][3] + M1_result.elem[0][1] * M2.elem[1][3] + M1_result.elem[0][2] * M2.elem[2][3] + M1_result.elem[0][3] * M2.elem[3][3];
00071     
00072     Temp.elem[1][0] = M1_result.elem[1][0] * M2.elem[0][0] + M1_result.elem[1][1] * M2.elem[1][0] + M1_result.elem[1][2] * M2.elem[2][0] + M1_result.elem[1][3] * M2.elem[3][0];
00073     Temp.elem[1][1] = M1_result.elem[1][0] * M2.elem[0][1] + M1_result.elem[1][1] * M2.elem[1][1] + M1_result.elem[1][2] * M2.elem[2][1] + M1_result.elem[1][3] * M2.elem[3][1];
00074     Temp.elem[1][2] = M1_result.elem[1][0] * M2.elem[0][2] + M1_result.elem[1][1] * M2.elem[1][2] + M1_result.elem[1][2] * M2.elem[2][2] + M1_result.elem[1][3] * M2.elem[3][2];
00075     Temp.elem[1][3] = M1_result.elem[1][0] * M2.elem[0][3] + M1_result.elem[1][1] * M2.elem[1][3] + M1_result.elem[1][2] * M2.elem[2][3] + M1_result.elem[1][3] * M2.elem[3][3];
00076 
00077     Temp.elem[2][0] = M1_result.elem[2][0] * M2.elem[0][0] + M1_result.elem[2][1] * M2.elem[1][0] + M1_result.elem[2][2] * M2.elem[2][0] + M1_result.elem[2][3] * M2.elem[3][0];
00078     Temp.elem[2][1] = M1_result.elem[2][0] * M2.elem[0][1] + M1_result.elem[2][1] * M2.elem[1][1] + M1_result.elem[2][2] * M2.elem[2][1] + M1_result.elem[2][3] * M2.elem[3][1];
00079     Temp.elem[2][2] = M1_result.elem[2][0] * M2.elem[0][2] + M1_result.elem[2][1] * M2.elem[1][2] + M1_result.elem[2][2] * M2.elem[2][2] + M1_result.elem[2][3] * M2.elem[3][2];
00080     Temp.elem[2][3] = M1_result.elem[2][0] * M2.elem[0][3] + M1_result.elem[2][1] * M2.elem[1][3] + M1_result.elem[2][2] * M2.elem[2][3] + M1_result.elem[2][3] * M2.elem[3][3];
00081 
00082     Temp.elem[3][0] = M1_result.elem[3][0] * M2.elem[0][0] + M1_result.elem[3][1] * M2.elem[1][0] + M1_result.elem[3][2] * M2.elem[2][0] + M1_result.elem[3][3] * M2.elem[3][0];
00083     Temp.elem[3][1] = M1_result.elem[3][0] * M2.elem[0][1] + M1_result.elem[3][1] * M2.elem[1][1] + M1_result.elem[3][2] * M2.elem[2][1] + M1_result.elem[3][3] * M2.elem[3][1];
00084     Temp.elem[3][2] = M1_result.elem[3][0] * M2.elem[0][2] + M1_result.elem[3][1] * M2.elem[1][2] + M1_result.elem[3][2] * M2.elem[2][2] + M1_result.elem[3][3] * M2.elem[3][2];
00085     Temp.elem[3][3] = M1_result.elem[3][0] * M2.elem[0][3] + M1_result.elem[3][1] * M2.elem[1][3] + M1_result.elem[3][2] * M2.elem[2][3] + M1_result.elem[3][3] * M2.elem[3][3];
00086     
00087     M1_result = Temp;
00088     return M1_result;
00089 }
00090 
00091 /* .
00092     This version of the Matrix44 Multiplication is used to do operation such 
00093     M2 = M1 * M2, normal version of the function does not use a temporary object so 
00094     it cannot be used. This version of the function execute operation M1 * M2 and
00095     store the result in the RIGHT operand (M2). This is the reason for suffix L
00096     (Left) in his name.
00097     @param M1 Left matrix involved into the operation
00098     @param M2 Right matrix involved into the operation
00099     @return A reference to the right matrix (second parameter) 
00100 */
00101 Matrix44 &PS2Math::Matrix44MultiplyR(const Matrix44 &M1, 
00102                                                        Matrix44 &M2_result) {
00103             
00104    //For this version simple operator * is used.
00105     M2_result = M1 * M2_result;
00106     return M2_result;
00107 }
00108 
00117 const Vector4 PS2Math::operator*(const Matrix44 &M, const Vector4 &V) {
00118 
00119     Vector4 Result;
00120     Result[0] = M[0][0] * V[0] + M[0][1] * V[1] + M[0][2] * V[2] + M[0][3] * V[3];
00121     Result[1] = M[1][0] * V[0] + M[1][1] * V[1] + M[1][2] * V[2] + M[1][3] * V[3];
00122     Result[2] = M[2][0] * V[0] + M[2][1] * V[1] + M[2][2] * V[2] + M[2][3] * V[3];
00123     Result[3] = M[3][0] * V[0] + M[3][1] * V[1] + M[3][2] * V[2] + M[3][3] * V[3];
00124 
00125     return Result;
00126 }

Generated on Wed Jan 7 19:11:57 2004 for PS2 Tutorial by doxygen 1.3.4