vector_transform.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 vector_transform_h
00014 #define vector_transform_h
00015 
00016 #include <cml/mathlib/checking.h>
00017 
00018 /* Functions for transforming a vector, representing a geometric point or
00019  * or vector, by an affine transfom.
00020  *
00021  * Note: This functionality may be provisional, depending on what architecture
00022  * we settle on for the higher-level math functions. If we do keep these
00023  * functions, then this code may ending up being a placeholder for expression
00024  * template code.
00025  */
00026 
00027 namespace cml {
00028 
00030 #define TEMP_VEC4 vector<          \
00031     typename et::ScalarPromote<    \
00032         typename MatT::value_type, \
00033         typename VecT::value_type  \
00034     >::type,                       \
00035     fixed<4>                       \
00036 >
00037 
00039 #define TEMP_VEC3 vector<          \
00040     typename et::ScalarPromote<    \
00041         typename MatT::value_type, \
00042         typename VecT::value_type  \
00043     >::type,                       \
00044     fixed<3>                       \
00045 >
00046 
00048 #define TEMP_VEC2 vector<          \
00049     typename et::ScalarPromote<    \
00050         typename MatT::value_type, \
00051         typename VecT::value_type  \
00052     >::type,                       \
00053     fixed<2>                       \
00054 >
00055 
00056 namespace detail {
00057 
00058 template < class MatT, class VecT > TEMP_VEC4
00059 transform_vector_4D(const MatT& m, const VecT& v, row_basis) {
00060     return v*m;
00061 }
00062 
00063 template < class MatT, class VecT > TEMP_VEC4
00064 transform_vector_4D(const MatT& m, const VecT& v, col_basis) {
00065     return m*v;
00066 }
00067 
00068 } // namespace detail
00069 
00071 template < class MatT, class VecT > TEMP_VEC4
00072 transform_vector_4D(const MatT& m, const VecT& v) {
00073     return detail::transform_vector_4D(m,v,typename MatT::basis_orient());
00074 }
00075 
00077 template < class MatT, class VecT > TEMP_VEC3
00078 transform_point(const MatT& m, const VecT& v)
00079 {
00080     typedef TEMP_VEC3 vector_type;
00081 
00082     /* Checking */
00083     detail::CheckMatAffine3D(m);
00084     detail::CheckVec3(v);
00085 
00086     return vector_type(
00087         m.basis_element(0,0)*v[0]+m.basis_element(1,0)*v[1]+
00088             m.basis_element(2,0)*v[2]+m.basis_element(3,0),
00089         m.basis_element(0,1)*v[0]+m.basis_element(1,1)*v[1]+
00090             m.basis_element(2,1)*v[2]+m.basis_element(3,1),
00091         m.basis_element(0,2)*v[0]+m.basis_element(1,2)*v[1]+
00092             m.basis_element(2,2)*v[2]+m.basis_element(3,2)
00093     );
00094 }
00095 
00097 template < class MatT, class VecT > TEMP_VEC3
00098 transform_vector(const MatT& m, const VecT& v)
00099 {
00100     typedef TEMP_VEC3 vector_type;
00101 
00102     /* Checking */
00103     detail::CheckMatLinear3D(m);
00104     detail::CheckVec3(v);
00105 
00106     return vector_type(
00107         m.basis_element(0,0)*v[0]+m.basis_element(1,0)*v[1]+
00108             m.basis_element(2,0)*v[2],
00109         m.basis_element(0,1)*v[0]+m.basis_element(1,1)*v[1]+
00110             m.basis_element(2,1)*v[2],
00111         m.basis_element(0,2)*v[0]+m.basis_element(1,2)*v[1]+
00112             m.basis_element(2,2)*v[2]
00113     );
00114 }
00115 
00117 template < class MatT, class VecT > TEMP_VEC2
00118 transform_point_2D(const MatT& m, const VecT& v)
00119 {
00120     typedef TEMP_VEC2 vector_type;
00121 
00122     /* Checking */
00123     detail::CheckMatAffine2D(m);
00124     detail::CheckVec2(v);
00125 
00126     return vector_type(
00127         m.basis_element(0,0)*v[0]+m.basis_element(1,0)*v[1]+
00128             m.basis_element(2,0),
00129         m.basis_element(0,1)*v[0]+m.basis_element(1,1)*v[1]+
00130             m.basis_element(2,1)
00131     );
00132 }
00133 
00135 template < class MatT, class VecT > TEMP_VEC2
00136 transform_vector_2D(const MatT& m, const VecT& v)
00137 {
00138     typedef TEMP_VEC2 vector_type;
00139 
00140     /* Checking */
00141     detail::CheckMatLinear2D(m);
00142     detail::CheckVec2(v);
00143 
00144     return vector_type(
00145         m.basis_element(0,0)*v[0] + m.basis_element(1,0)*v[1],
00146         m.basis_element(0,1)*v[0] + m.basis_element(1,1)*v[1]
00147     );
00148 }
00149 
00150 #undef TEMP_VEC4
00151 #undef TEMP_VEC3
00152 #undef TEMP_VEC2
00153 
00154 } // namespace cml
00155 
00156 #endif

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