Vector Transform (Quaternion) | |
template<typename DATA_TYPE> VecBase< DATA_TYPE, 3 > & | xform (VecBase< DATA_TYPE, 3 > &result, const Quat< DATA_TYPE > &rot, const VecBase< DATA_TYPE, 3 > &vector) |
transform a vector by a rotation quaternion. More... | |
template<typename DATA_TYPE> VecBase< DATA_TYPE, 3 > | operator * (const Quat< DATA_TYPE > &rot, const VecBase< DATA_TYPE, 3 > &vector) |
transform a vector by a rotation quaternion. More... | |
template<typename DATA_TYPE> VecBase< DATA_TYPE, 3 > | operator *= (VecBase< DATA_TYPE, 3 > &vector, const Quat< DATA_TYPE > &rot) |
transform a vector by a rotation quaternion. More... | |
Vector Transform (Matrix) | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS> Vec< DATA_TYPE, COLS > & | xform (Vec< DATA_TYPE, COLS > &result, const Matrix< DATA_TYPE, ROWS, COLS > &matrix, const Vec< DATA_TYPE, COLS > &vector) |
xform a vector by a matrix. More... | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS> Vec< DATA_TYPE, COLS > | operator * (const Matrix< DATA_TYPE, ROWS, COLS > &matrix, const Vec< DATA_TYPE, COLS > &vector) |
matrix * vector xform. More... | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS, unsigned VEC_SIZE> Vec< DATA_TYPE, VEC_SIZE > & | xform (Vec< DATA_TYPE, VEC_SIZE > &result, const Matrix< DATA_TYPE, ROWS, COLS > &matrix, const Vec< DATA_TYPE, VEC_SIZE > &vector) |
partially transform a partially specified vector by a matrix, assumes last elt of vector is 0 (the 0 makes it only partially transformed). More... | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS, unsigned COLS_MINUS_ONE> Vec< DATA_TYPE, COLS_MINUS_ONE > | operator * (const Matrix< DATA_TYPE, ROWS, COLS > &matrix, const Vec< DATA_TYPE, COLS_MINUS_ONE > &vector) |
matrix * partial vector, assumes last elt of vector is 0 (partial transform). More... | |
Point Transform (Matrix) | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS> Point< DATA_TYPE, COLS > & | xform (Point< DATA_TYPE, COLS > &result, const Matrix< DATA_TYPE, ROWS, COLS > &matrix, const Point< DATA_TYPE, COLS > &point) |
transform point by a matrix. More... | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS> Point< DATA_TYPE, COLS > | operator * (const Matrix< DATA_TYPE, ROWS, COLS > &matrix, const Point< DATA_TYPE, COLS > &point) |
matrix * point. More... | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS, unsigned PNT_SIZE> Point< DATA_TYPE, PNT_SIZE > & | xform (Point< DATA_TYPE, PNT_SIZE > &result, const Matrix< DATA_TYPE, ROWS, COLS > &matrix, const Point< DATA_TYPE, PNT_SIZE > &point) |
transform a partially specified point by a matrix, assumes last elt of point is 1. More... | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS, unsigned COLS_MINUS_ONE> Point< DATA_TYPE, COLS_MINUS_ONE > | operator * (const Matrix< DATA_TYPE, ROWS, COLS > &matrix, const Point< DATA_TYPE, COLS_MINUS_ONE > &point) |
matrix * partially specified point. More... | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS> Point< DATA_TYPE, COLS > | operator * (const Point< DATA_TYPE, COLS > &point, const Matrix< DATA_TYPE, ROWS, COLS > &matrix) |
point * a matrix multiplication of [m x k] matrix by a [k x 1] matrix (also known as a Point [with w == 1 for points by definition] ). More... | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS> Point< DATA_TYPE, COLS > | operator *= (Point< DATA_TYPE, COLS > &point, const Matrix< DATA_TYPE, ROWS, COLS > &matrix) |
point *= a matrix multiplication of [m x k] matrix by a [k x 1] matrix (also known as a Point [with w == 1 for points by definition] ). More... | |
template<typename DATA_TYPE, unsigned ROWS, unsigned COLS, unsigned COLS_MINUS_ONE> Point< DATA_TYPE, COLS_MINUS_ONE > | operator *= (Point< DATA_TYPE, COLS_MINUS_ONE > &point, const Matrix< DATA_TYPE, ROWS, COLS > &matrix) |
partial point *= a matrix multiplication of [m x k] matrix by a [k-1 x 1] matrix (also known as a Point [with w == 1 for points by definition] ). More... |
Note that xform is defined differently for Point and Vec. By Point is a full xform, by Vec is only a rotation.
|
point * a matrix multiplication of [m x k] matrix by a [k x 1] matrix (also known as a Point [with w == 1 for points by definition] ).
Definition at line 345 of file Xforms.h.
00346 { 00347 Point<DATA_TYPE, COLS> temporary; 00348 return xform( temporary, matrix, point ); 00349 } |
|
matrix * partially specified point. multiplication of [m x k] matrix by a [k-1 x 1] matrix (also known as a Point [with w == 1 for points by definition] ).
Definition at line 331 of file Xforms.h.
00332 { 00333 Point<DATA_TYPE, COLS_MINUS_ONE> temporary; 00334 return xform( temporary, matrix, point ); 00335 } |
|
matrix * point. multiplication of [m x k] matrix by a [k x 1] matrix (also known as a Point...).
Definition at line 272 of file Xforms.h.
00273 { 00274 Point<DATA_TYPE, COLS> temporary; 00275 return xform( temporary, matrix, point ); 00276 } |
|
matrix * partial vector, assumes last elt of vector is 0 (partial transform).
Definition at line 226 of file Xforms.h.
00227 { 00228 Vec<DATA_TYPE, COLS_MINUS_ONE> temporary; 00229 return xform( temporary, matrix, vector ); 00230 } |
|
matrix * vector xform. multiplication of [m x k] matrix by a [k x 1] matrix (also known as a Vector...).
Definition at line 166 of file Xforms.h.
00167 { 00168 // do a standard [m x k] by [k x n] matrix multiplication (where n == 0). 00169 Vec<DATA_TYPE, COLS> temporary; 00170 return xform( temporary, matrix, vector ); 00171 } |
|
transform a vector by a rotation quaternion.
Definition at line 101 of file Xforms.h.
00102 { 00103 VecBase<DATA_TYPE, 3> temporary; 00104 return xform( temporary, rot, vector ); 00105 } |
|
partial point *= a matrix multiplication of [m x k] matrix by a [k-1 x 1] matrix (also known as a Point [with w == 1 for points by definition] ).
Definition at line 375 of file Xforms.h.
00376 { 00377 Point<DATA_TYPE, COLS_MINUS_ONE> temporary = point; 00378 return xform( point, matrix, temporary); 00379 } |
|
point *= a matrix multiplication of [m x k] matrix by a [k x 1] matrix (also known as a Point [with w == 1 for points by definition] ).
Definition at line 360 of file Xforms.h.
00361 { 00362 Point<DATA_TYPE, COLS> temporary = point; 00363 return xform( point, matrix, temporary); 00364 } |
|
transform a vector by a rotation quaternion.
Definition at line 115 of file Xforms.h.
00116 { 00117 VecBase<DATA_TYPE, 3> temporary = vector; 00118 return xform( vector, rot, temporary); 00119 } |
|
transform a partially specified point by a matrix, assumes last elt of point is 1. Transforms a point with a matrix, uses multiplication of [m x k] matrix by a [k-1 x 1] matrix (also known as a Point [with w == 1 for points by definition] ).
Definition at line 291 of file Xforms.h.
00292 { 00293 gmtlASSERT( PNT_SIZE == COLS - 1 && "The precondition of this method is that the vector size must be one less than the number of columns in the matrix. eg. if Mat<n,k>, then Vec<k-1>." ); 00294 00295 // copy the point to the correct size. 00296 Point<DATA_TYPE, PNT_SIZE+1> temp_point, temp_result; 00297 for (unsigned x = 0; x < PNT_SIZE; ++x) 00298 temp_point[x] = point[x]; 00299 temp_point[PNT_SIZE] = (DATA_TYPE)1.0; // by definition of a point, set the last unspecified elt to 1.0 00300 00301 // transform it. 00302 xform<DATA_TYPE, ROWS, COLS>( temp_result, matrix, temp_point ); 00303 00304 // convert result back to pnt<DATA_TYPE, PNT_SIZE> 00305 // some matrices will make the W param large even if this is a true vector, 00306 // we'll need to redistribute it to the other elts if W param is non-zero 00307 if (Math::isEqual( temp_result[PNT_SIZE], (DATA_TYPE)0, (DATA_TYPE)0.0001 ) == false) 00308 { 00309 DATA_TYPE w_coord_div = DATA_TYPE( 1.0 ) / temp_result[PNT_SIZE]; 00310 for (unsigned x = 0; x < PNT_SIZE; ++x) 00311 result[x] = temp_result[x] * w_coord_div; 00312 } 00313 else 00314 { 00315 for (unsigned x = 0; x < PNT_SIZE; ++x) 00316 result[x] = temp_result[x]; 00317 } 00318 00319 return result; 00320 } |
|
partially transform a partially specified vector by a matrix, assumes last elt of vector is 0 (the 0 makes it only partially transformed). Transforms a vector with a matrix, uses multiplication of [m x k] matrix by a [k-1 x 1] matrix (also known as a Vector [with w == 0 for vectors by definition] ).
Definition at line 185 of file Xforms.h.
00186 { 00187 gmtlASSERT( VEC_SIZE == COLS - 1 ); 00188 // do a standard [m x k] by [k x n] matrix multiplication (where n == 0). 00189 00190 // copy the point to the correct size. 00191 Vec<DATA_TYPE, COLS> temp_vector, temp_result; 00192 for (unsigned x = 0; x < VEC_SIZE; ++x) 00193 temp_vector[x] = vector[x]; 00194 temp_vector[COLS-1] = (DATA_TYPE)0.0; // by definition of a vector, set the last unspecified elt to 0.0 00195 00196 // transform it. 00197 xform<DATA_TYPE, ROWS, COLS>( temp_result, matrix, temp_vector ); 00198 00199 // convert result back to vec<DATA_TYPE, VEC_SIZE> 00200 // some matrices will make the W param large even if this is a true vector, 00201 // we'll need to redistribute it to the other elts if W param is non-zero 00202 if (Math::isEqual( temp_result[VEC_SIZE], (DATA_TYPE)0, (DATA_TYPE)0.0001 ) == false) 00203 { 00204 DATA_TYPE w_coord_div = DATA_TYPE( 1.0 ) / temp_result[VEC_SIZE]; 00205 for (unsigned x = 0; x < VEC_SIZE; ++x) 00206 result[x] = temp_result[x] * w_coord_div; 00207 } 00208 else 00209 { 00210 for (unsigned x = 0; x < VEC_SIZE; ++x) 00211 result[x] = temp_result[x]; 00212 } 00213 00214 return result; 00215 } |
|
transform point by a matrix. multiplication of [m x k] matrix by a [k x 1] matrix (also known as a Point...).
Definition at line 249 of file Xforms.h.
00250 { 00251 // do a standard [m x k] by [k x n] matrix multiplication (n == 1). 00252 00253 // reset point to zero... 00254 result = Point<DATA_TYPE, COLS>(); 00255 00256 for (unsigned iRow = 0; iRow < ROWS; ++iRow) 00257 for (unsigned iCol = 0; iCol < COLS; ++iCol) 00258 result[iRow] += matrix( iRow, iCol ) * point[iCol]; 00259 00260 return result; 00261 } |
|
xform a vector by a matrix. Transforms a vector with a matrix, uses multiplication of [m x k] matrix by a [k x 1] matrix (the later also known as a Vector...).
Definition at line 140 of file Xforms.h.
00141 { 00142 // do a standard [m x k] by [k x n] matrix multiplication (where n == 0). 00143 00144 // reset vec to zero... 00145 result = Vec<DATA_TYPE, COLS>(); 00146 00147 for (unsigned iRow = 0; iRow < ROWS; ++iRow) 00148 for (unsigned iCol = 0; iCol < COLS; ++iCol) 00149 result[iRow] += matrix( iRow, iCol ) * vector[iCol]; 00150 00151 return result; 00152 } |
|
transform a vector by a rotation quaternion.
Definition at line 67 of file Xforms.h.
00068 { 00069 // check preconditions... 00070 gmtlASSERT( Math::isEqual( length( rot ), (DATA_TYPE)1.0, (DATA_TYPE)0.0001 ) && "must pass a rotation quaternion to xform(result,quat,vec) - by definition, a rotation quaternion is normalized). if you need non-rotation quaternion support, let us know." ); 00071 00072 // easiest to write and understand (slowest too) 00073 //return result_vec = makeVec( rot * makePure( vector ) * makeConj( rot ) ); 00074 00075 // completely hand expanded 00076 // (faster by 28% in gcc 2.96 debug mode.) 00077 // (faster by 35% in gcc 2.96 opt3 mode (78% for doubles)) 00078 Quat<DATA_TYPE> rot_conj( -rot[Xelt], -rot[Yelt], -rot[Zelt], rot[Welt] ); 00079 Quat<DATA_TYPE> pure( vector[0], vector[1], vector[2], (DATA_TYPE)0.0 ); 00080 Quat<DATA_TYPE> temp( 00081 pure[Welt]*rot_conj[Xelt] + pure[Xelt]*rot_conj[Welt] + pure[Yelt]*rot_conj[Zelt] - pure[Zelt]*rot_conj[Yelt], 00082 pure[Welt]*rot_conj[Yelt] + pure[Yelt]*rot_conj[Welt] + pure[Zelt]*rot_conj[Xelt] - pure[Xelt]*rot_conj[Zelt], 00083 pure[Welt]*rot_conj[Zelt] + pure[Zelt]*rot_conj[Welt] + pure[Xelt]*rot_conj[Yelt] - pure[Yelt]*rot_conj[Xelt], 00084 pure[Welt]*rot_conj[Welt] - pure[Xelt]*rot_conj[Xelt] - pure[Yelt]*rot_conj[Yelt] - pure[Zelt]*rot_conj[Zelt] ); 00085 00086 result.set( 00087 rot[Welt]*temp[Xelt] + rot[Xelt]*temp[Welt] + rot[Yelt]*temp[Zelt] - rot[Zelt]*temp[Yelt], 00088 rot[Welt]*temp[Yelt] + rot[Yelt]*temp[Welt] + rot[Zelt]*temp[Xelt] - rot[Xelt]*temp[Zelt], 00089 rot[Welt]*temp[Zelt] + rot[Zelt]*temp[Welt] + rot[Xelt]*temp[Yelt] - rot[Yelt]*temp[Xelt] ); 00090 return result; 00091 } |