00001
00002
00003
00004
00005
00006
00007
00008
00013 #ifndef vector_transform_h
00014 #define vector_transform_h
00015
00016 #include <cml/mathlib/checking.h>
00017
00018
00019
00020
00021
00022
00023
00024
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 }
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
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
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
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
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 }
00155
00156 #endif