Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

Mixed.h

Go to the documentation of this file.
00001 /*
00002     File:           Mixed.h
00003     
00004     Function:       Provides 'mixed' operations that allow matrices of one
00005                     type to be used to transform vectors of another. This
00006                     can be useful if you want to keep your data in a lower
00007                     precision format (e.g., float) for space reasons, but
00008                     use a high-precision format for transformations (e.g.,
00009                     double) for accuracy.
00010 
00011                     The operations defined here are the various flavours of
00012                     matrix/vector multiplication, and the necessary dot
00013                     products to implement those.
00014     
00015     Author(s):      Andrew Willmott
00016 
00017     Copyright:      (c) 1997-2000, Andrew Willmott
00018 */
00019 
00020 #include "vl/VL.h"
00021 
00022 // dot prods
00023 
00024 TMReal          dot(const TMVec &a, const TVec &b);  // v . a
00025 TMReal          dot(const TMSparseVec &a, const TSparseVec &b);
00026 TMReal          dot(const TMSparseVec &a, const TVec &b);
00027 
00028 // xform
00029 
00030 inline TVec2    xform(const TMat2 &m, const TVec2 &v);
00031 inline TVec2    xform(const TMat3 &m, const TVec2 &v);
00032 inline TVec3    xform(const TMat3 &m, const TVec3 &v);
00033 inline TVec3    xform(const TMat4 &m, const TVec3 &v);
00034 inline TVec4    xform(const TMat4 &m, const TVec4 &v);
00035 
00036 // matrix-vector multiplications
00037 
00038 inline TVec2    &operator *= (TVec2 &v, const TMat2 &m);
00039 inline TVec2    operator * (const TMat2 &m, const TVec2 &v);
00040 inline TVec2    operator * (const TVec2 &v, const TMat2 &m);
00041 
00042 inline TVec3    &operator *= (TVec3 &v, const TMat3 &m);    
00043 inline TVec3    operator * (const TMat3 &m, const TVec3 &v);
00044 inline TVec3    operator * (const TVec3 &v, const TMat3 &m);
00045 
00046 TVec4           operator * (const TMat4 &m, const TVec4 &v);
00047 TVec4           operator * (const TVec4 &v, const TMat4 &m);
00048 TVec4           &operator *= (TVec4 &a, const TMat4 &m);    
00049 
00050 TVec            operator * (const TMat &m, const TVec &v);
00051 TVec            operator * (const TVec &v, const TMat &m);
00052 TVec            &operator *= (TVec &v, const TMat &m);
00053 
00054 #ifdef __SparseVec__
00055 TSparseVec      &operator *= (TSparseVec &v, const TSparseMat &m);
00056 TSparseVec      operator * (const TSparseVec &v, const TSparseMat &m);
00057 TSparseVec      operator * (const TSparseMat &m, const TSparseVec &v);
00058 TVec            &operator *= (TVec &v, const TSparseMat &m);
00059 TVec            operator * (const TVec &v, const TSparseMat &m);
00060 TVec            operator * (const TSparseMat &m, const TVec &v);
00061 #endif
00062 
00063 // inlines
00064 
00065 inline TVec2 operator * (const TMat2 &m, const TVec2 &v)
00066 {
00067     TVec2 result;
00068 
00069     result[0] = m[0][0] * v[0] + m[0][1] * v[1];
00070     result[1] = m[1][0] * v[0] + m[1][1] * v[1];
00071 
00072     return(result);
00073 }
00074 
00075 inline TVec2 operator * (const TVec2 &v, const TMat2 &m)            
00076 {
00077     TVec2 result;
00078 
00079     result[0] = v[0] * m[0][0] + v[1] * m[1][0];
00080     result[1] = v[0] * m[0][1] + v[1] * m[1][1];
00081 
00082     return(result);
00083 }
00084 
00085 inline TVec2 &operator *= (TVec2 &v, const TMat2 &m)        
00086 {
00087     TVReal t;
00088     
00089     t    = v[0] * m[0][0] + v[1] * m[1][0];
00090     v[1] = v[0] * m[0][1] + v[1] * m[1][1];
00091     v[0] = t;
00092 
00093     return(v);
00094 }
00095 
00096 inline TVec3 operator * (const TMat3 &m, const TVec3 &v)
00097 {
00098     TVec3 result;
00099     
00100     result[0] = v[0] * m[0][0] + v[1] * m[0][1] + v[2] * m[0][2];
00101     result[1] = v[0] * m[1][0] + v[1] * m[1][1] + v[2] * m[1][2];
00102     result[2] = v[0] * m[2][0] + v[1] * m[2][1] + v[2] * m[2][2];
00103     
00104     return(result);
00105 }
00106 
00107 inline TVec3 operator * (const TVec3 &v, const TMat3 &m)    
00108 {
00109     TVec3 result;
00110     
00111     result[0] = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0];
00112     result[1] = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1];
00113     result[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2];
00114     
00115     return(result);
00116 }
00117 
00118 inline TVec3 &operator *= (TVec3 &v, const TMat3 &m)            
00119 {   
00120     TVReal t0, t1;
00121     
00122     t0   = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0];
00123     t1   = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1];
00124     v[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2];
00125     v[0] = t0;
00126     v[1] = t1;
00127 
00128     return(v);
00129 }
00130 
00131 #ifdef VL_ROW_ORIENT
00132 inline TVec2 xform(const TMat2 &m, const TVec2 &v)
00133 { return(v * m); }
00134 inline TVec2 xform(const TMat3 &m, const TVec2 &v)
00135 { return(proj(TVec3(v, 1.0) * m)); }
00136 inline TVec3 xform(const TMat3 &m, const TVec3 &v)
00137 { return(v * m); }
00138 inline TVec3 xform(const TMat4 &m, const TVec3 &v)
00139 { return(proj(TVec4(v, 1.0) * m)); }
00140 inline TVec4 xform(const TMat4 &m, const TVec4 &v)
00141 { return(v * m); }
00142 #else
00143 inline TVec2 xform(const TMat2 &m, const TVec2 &v)
00144 { return(m * v); }
00145 inline TVec2 xform(const TMat3 &m, const TVec2 &v)
00146 { return(proj(m * TVec3(v, 1.0))); }
00147 inline TVec3 xform(const TMat3 &m, const TVec3 &v)
00148 { return(m * v); }
00149 inline TVec3 xform(const TMat4 &m, const TVec3 &v)
00150 { return(proj(m * TVec4(v, 1.0))); }
00151 inline TVec4 xform(const TMat4 &m, const TVec4 &v)
00152 { return(m * v); }
00153 #endif

Generated at Sat Aug 5 00:16:47 2000 for Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000