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