matrix_basis.h

Go to the documentation of this file.
00001 /* -*- C++ -*- ------------------------------------------------------------
00002  
00003 Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/
00004 
00005 The Configurable Math Library (CML) is distributed under the terms of the
00006 Boost Software License, v1.0 (see cml/LICENSE for details).
00007 
00008  *-----------------------------------------------------------------------*/
00013 #ifndef matrix_basis_h
00014 #define matrix_basis_h
00015 
00016 #include <cml/mathlib/checking.h>
00017 
00018 /* This file contains functions for setting and retrieving the basis vectors
00019  * or transposed basis vectors of a matrix representing a 3D or 2D transform,
00020  * either by index (0,1,2) or name (x,y,z).
00021  *
00022  * In addition to being a convenience for the user, the functions are also
00023  * in support of other matrix functions which are best implemented in vector
00024  * form (such as orthogonalization and construction of orthonormal bases).
00025  *
00026  * Note that matrix expression arguments are allowed to have dimensions larger
00027  * than the minimum requirement. For example, matrix_get_basis_vector() can be
00028  * called on any NxM matrix with N,M >= 3.
00029  *
00030  * As with other matrix functions, the following template argument notation is
00031  * used for conciseness:
00032  *
00033  * E = vector or matrix element type
00034  * A = vector or matrix array storage type
00035  * B = matrix basis orientation type
00036  * L = matrix layout type
00037  */
00038 
00039 namespace cml {
00040 
00042 // Functions for setting the basis vectors of a 3D or 2D transform matrix
00044 
00046 template < typename E, class A, class B, class L, class VecT > void
00047 matrix_set_basis_vector(matrix<E,A,B,L>& m, size_t i, const VecT& v)
00048 {
00049     /* Checking */
00050     detail::CheckMatLinear3D(m);
00051     detail::CheckVec3(v);
00052     detail::CheckIndex3(i);
00053 
00054     m.set_basis_element(i,0,v[0]);
00055     m.set_basis_element(i,1,v[1]);
00056     m.set_basis_element(i,2,v[2]);
00057 }
00058 
00060 template < typename E, class A, class B, class L, class VecT > void
00061 matrix_set_transposed_basis_vector(matrix<E,A,B,L>& m,size_t i,const VecT& v)
00062 {
00063     /* Checking */
00064     detail::CheckMatLinear3D(m);
00065     detail::CheckVec3(v);
00066     detail::CheckIndex3(i);
00067 
00068     m.set_basis_element(0,i,v[0]);
00069     m.set_basis_element(1,i,v[1]);
00070     m.set_basis_element(2,i,v[2]);
00071 }
00072 
00074 template < typename E, class A, class B, class L, class VecT > void
00075 matrix_set_basis_vector_2D(matrix<E,A,B,L>& m, size_t i, const VecT& v)
00076 {
00077     /* Checking */
00078     detail::CheckMatLinear2D(m);
00079     detail::CheckVec2(v);
00080     detail::CheckIndex2(i);
00081 
00082     m.set_basis_element(i,0,v[0]);
00083     m.set_basis_element(i,1,v[1]);
00084 }
00085 
00087 template < typename E, class A, class B, class L, class VecT > void
00088 matrix_set_transposed_basis_vector_2D(
00089     matrix<E,A,B,L>& m, size_t i, const VecT& v)
00090 {
00091     /* Checking */
00092     detail::CheckMatLinear2D(m);
00093     detail::CheckVec2(v);
00094     detail::CheckIndex2(i);
00095 
00096     m.set_basis_element(0,i,v[0]);
00097     m.set_basis_element(1,i,v[1]);
00098 }
00099 
00101 template < typename E, class A, class B, class L, class VecT > void
00102 matrix_set_x_basis_vector(matrix<E,A,B,L>& m, const VecT& x) {
00103     matrix_set_basis_vector(m,0,x);
00104 }
00105 
00107 template < typename E, class A, class B, class L, class VecT > void
00108 matrix_set_y_basis_vector(matrix<E,A,B,L>& m, const VecT& y) {
00109     matrix_set_basis_vector(m,1,y);
00110 }
00111 
00113 template < typename E, class A, class B, class L, class VecT > void
00114 matrix_set_z_basis_vector(matrix<E,A,B,L>& m, const VecT& z) {
00115     matrix_set_basis_vector(m,2,z);
00116 }
00117 
00119 template < typename E, class A, class B, class L, class VecT > void
00120 matrix_set_transposed_x_basis_vector(matrix<E,A,B,L>& m, const VecT& x) {
00121     matrix_set_transposed_basis_vector(m,0,x);
00122 }
00123 
00125 template < typename E, class A, class B, class L, class VecT > void
00126 matrix_set_transposed_y_basis_vector(matrix<E,A,B,L>& m, const VecT& y) {
00127     matrix_set_transposed_basis_vector(m,1,y);
00128 }
00129 
00131 template < typename E, class A, class B, class L, class VecT > void
00132 matrix_set_transposed_z_basis_vector(matrix<E,A,B,L>& m, const VecT& z) {
00133     matrix_set_transposed_basis_vector(m,2,z);
00134 }
00135 
00137 template < typename E, class A, class B, class L, class VecT > void
00138 matrix_set_x_basis_vector_2D(matrix<E,A,B,L>& m, const VecT& x) {
00139     matrix_set_basis_vector_2D(m,0,x);
00140 }
00141 
00143 template < typename E, class A, class B, class L, class VecT > void
00144 matrix_set_y_basis_vector_2D(matrix<E,A,B,L>& m, const VecT& y) {
00145     matrix_set_basis_vector_2D(m,1,y);
00146 }
00147 
00149 template < typename E, class A, class B, class L, class VecT > void
00150 matrix_set_transposed_x_basis_vector_2D(matrix<E,A,B,L>& m,const VecT& x) {
00151     matrix_set_transposed_basis_vector_2D(m,0,x);
00152 }
00153 
00155 template < typename E, class A, class B, class L, class VecT > void
00156 matrix_set_transposed_y_basis_vector_2D(matrix<E,A,B,L>& m,const VecT& y) {
00157     matrix_set_transposed_basis_vector_2D(m,1,y);
00158 }
00159 
00161 template < typename E, class A, class B, class L,
00162     class VecT_1, class VecT_2, class VecT_3 > void
00163 matrix_set_basis_vectors(
00164     matrix<E,A,B,L>& m, const VecT_1& x, const VecT_2& y, const VecT_3& z)
00165 {
00166     matrix_set_x_basis_vector(m,x);
00167     matrix_set_y_basis_vector(m,y);
00168     matrix_set_z_basis_vector(m,z);
00169 }
00170 
00172 template < typename E, class A, class B, class L,
00173     class VecT_1, class VecT_2, class VecT_3 > void
00174 matrix_set_transposed_basis_vectors(
00175     matrix<E,A,B,L>& m, const VecT_1& x, const VecT_2& y, const VecT_3& z)
00176 {
00177     matrix_set_transposed_x_basis_vector(m,x);
00178     matrix_set_transposed_y_basis_vector(m,y);
00179     matrix_set_transposed_z_basis_vector(m,z);
00180 }
00181 
00183 template < typename E,class A,class B,class L,class VecT_1,class VecT_2 > void
00184 matrix_set_basis_vectors_2D(
00185     matrix<E,A,B,L>& m, const VecT_1& x, const VecT_2& y)
00186 {
00187     matrix_set_x_basis_vector_2D(m,x);
00188     matrix_set_y_basis_vector_2D(m,y);
00189 }
00190 
00192 template < typename E,class A,class B,class L,class VecT_1,class VecT_2 > void
00193 matrix_set_transposed_basis_vectors_2D(
00194     matrix<E,A,B,L>& m, const VecT_1& x, const VecT_2& y)
00195 {
00196     matrix_set_transposed_x_basis_vector_2D(m,x);
00197     matrix_set_transposed_y_basis_vector_2D(m,y);
00198 }
00199 
00201 // Functions for getting the basis vectors of a 3D or 2D transform matrix
00203 
00204 #define TEMP_VEC3 vector< typename MatT::value_type, fixed<3> >
00205 #define TEMP_VEC2 vector< typename MatT::value_type, fixed<2> >
00206 
00208 template < class MatT > TEMP_VEC3
00209 matrix_get_basis_vector(const MatT& m, size_t i)
00210 {
00211     typedef TEMP_VEC3 vector_type;
00212 
00213     /* Checking */
00214     detail::CheckMatLinear3D(m);
00215     detail::CheckIndex3(i);
00216 
00217     return vector_type(
00218         m.basis_element(i,0), m.basis_element(i,1), m.basis_element(i,2));
00219 }
00220 
00222 template < class MatT > TEMP_VEC3
00223 matrix_get_transposed_basis_vector(const MatT& m, size_t i)
00224 {
00225     typedef typename MatT::value_type value_type;
00226     typedef vector< value_type, fixed<3> > vector_type;
00227     
00228     /* Checking */
00229     detail::CheckMatLinear3D(m);
00230     detail::CheckIndex3(i);
00231 
00232     return vector_type(
00233         m.basis_element(0,i), m.basis_element(1,i), m.basis_element(2,i));
00234 }
00235 
00237 template < class MatT > TEMP_VEC2
00238 matrix_get_basis_vector_2D(const MatT& m, size_t i)
00239 {
00240     typedef TEMP_VEC2 vector_type;
00241 
00242     /* Checking */
00243     detail::CheckMatLinear2D(m);
00244     detail::CheckIndex2(i);
00245 
00246     return vector_type(m.basis_element(i,0), m.basis_element(i,1));
00247 }
00248 
00250 template < class MatT > TEMP_VEC2
00251 matrix_get_transposed_basis_vector_2D(const MatT& m, size_t i)
00252 {
00253     typedef TEMP_VEC2 vector_type;
00254 
00255     /* Checking */
00256     detail::CheckMatLinear2D(m);
00257     detail::CheckIndex2(i);
00258 
00259     return vector_type(m.basis_element(0,i), m.basis_element(1,i));
00260 }
00261 
00263 template < class MatT > TEMP_VEC3
00264 matrix_get_x_basis_vector(const MatT& m) {
00265     return matrix_get_basis_vector(m,0);
00266 }
00267 
00269 template < class MatT > TEMP_VEC3
00270 matrix_get_y_basis_vector(const MatT& m) {
00271     return matrix_get_basis_vector(m,1);
00272 }
00273 
00275 template < class MatT > TEMP_VEC3
00276 matrix_get_z_basis_vector(const MatT& m) {
00277     return matrix_get_basis_vector(m,2);
00278 }
00279 
00281 template < class MatT > TEMP_VEC3
00282 matrix_get_transposed_x_basis_vector(const MatT& m) {
00283     return matrix_get_transposed_basis_vector(m,0);
00284 }
00285 
00287 template < class MatT > TEMP_VEC3
00288 matrix_get_transposed_y_basis_vector(const MatT& m) {
00289     return matrix_get_transposed_basis_vector(m,1);
00290 }
00291 
00293 template < class MatT > TEMP_VEC3
00294 matrix_get_transposed_z_basis_vector(const MatT& m) {
00295     return matrix_get_transposed_basis_vector(m,2);
00296 }
00297 
00299 template < class MatT > TEMP_VEC2
00300 matrix_get_x_basis_vector_2D(const MatT& m) {
00301     return matrix_get_basis_vector_2D(m,0);
00302 }
00303 
00305 template < class MatT > TEMP_VEC2
00306 matrix_get_y_basis_vector_2D(const MatT& m) {
00307     return matrix_get_basis_vector_2D(m,1);
00308 }
00309 
00311 template < class MatT > TEMP_VEC2
00312 matrix_get_transposed_x_basis_vector_2D(const MatT& m) {
00313     return matrix_get_transposed_basis_vector_2D(m,0);
00314 }
00315 
00317 template < class MatT > TEMP_VEC2
00318 matrix_get_transposed_y_basis_vector_2D(const MatT& m) {
00319     return matrix_get_transposed_basis_vector_2D(m,1);
00320 }
00321 
00323 template < class MatT, class E, class A > void
00324 matrix_get_basis_vectors(
00325     const MatT& m, vector<E,A>& x, vector<E,A>& y, vector<E,A>& z)
00326 {
00327     x = matrix_get_x_basis_vector(m);
00328     y = matrix_get_y_basis_vector(m);
00329     z = matrix_get_z_basis_vector(m);
00330 }
00331 
00333 template < class MatT, typename E, class A > void
00334 matrix_get_transposed_basis_vectors(
00335     const MatT& m, vector<E,A>& x, vector<E,A>& y, vector<E,A>& z)
00336 {
00337     x = matrix_get_transposed_x_basis_vector(m);
00338     y = matrix_get_transposed_y_basis_vector(m);
00339     z = matrix_get_transposed_z_basis_vector(m);
00340 }
00341 
00343 template < class MatT, typename E, class A > void
00344 matrix_get_basis_vectors_2D(const MatT& m,vector<E,A>& x,vector<E,A>& y)
00345 {
00346     x = matrix_get_x_basis_vector_2D(m);
00347     y = matrix_get_y_basis_vector_2D(m);
00348 }
00349 
00351 template < class MatT, typename E, class A > void
00352 matrix_get_transposed_basis_vectors_2D(
00353     const MatT& m, vector<E,A>& x, vector<E,A>& y)
00354 {
00355     x = matrix_get_transposed_x_basis_vector_2D(m);
00356     y = matrix_get_transposed_y_basis_vector_2D(m);
00357 }
00358 
00359 #undef TEMP_VEC3
00360 #undef TEMP_VEC2
00361 
00362 } // namespace cml
00363 
00364 #endif

Generated on Sat Jul 18 19:35:22 2009 for CML 1.0 by  doxygen 1.5.9