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