00001 /*
00002 File: Mat3.h
00003
00004 Function: Defines a 3 x 3 matrix.
00005
00006 Author(s): Andrew Willmott
00007
00008 Copyright: (c) 1995-2000, Andrew Willmott
00009 */
00010
00011 #ifndef __Mat3__
00012 #define __Mat3__
00013
00014 #include "vl/VL.h"
00015 // Defines the actual type for TMat3 etc.
00016 #include "vl/Vec3.h"
00017
00018
00019 // --- Mat3 Class -------------------------------------------------------------
00020
00021
00022 class TVec4;
00023
00024 class TMat3
00025 {
00026 public:
00027
00028 // Constructors
00029
00030 inline TMat3();
00031 TMat3(TMReal a, TMReal b, TMReal c,
00032 TMReal d, TMReal e, TMReal f,
00033 TMReal g, TMReal h, TMReal i);
00034 TMat3(const TMat3 &m); // Copy constructor
00035 TMat3(ZeroOrOne k);
00036 TMat3(Block k);
00037
00038 // Accessor functions
00039
00040 inline Int Rows() const { return(3); };
00041 inline Int Cols() const { return(3); };
00042
00043 inline TMVec3 &operator [] (Int i);
00044 inline const TMVec3 &operator [] (Int i) const;
00045
00046 inline TMReal *Ref() const; // Return pointer to data
00047
00048 // Assignment operators
00049
00050 TMat3 &operator = (const TMat3 &m);
00051 inline TMat3 &operator = (ZeroOrOne k);
00052 inline TMat3 &operator = (Block k);
00053 TMat3 &operator += (const TMat3 &m);
00054 TMat3 &operator -= (const TMat3 &m);
00055 TMat3 &operator *= (const TMat3 &m);
00056 TMat3 &operator *= (TMReal s);
00057 TMat3 &operator /= (TMReal s);
00058
00059 // Comparison operators
00060
00061 Bool operator == (const TMat3 &m) const; // M == N?
00062 Bool operator != (const TMat3 &m) const; // M != N?
00063
00064 // Arithmetic operators
00065
00066 TMat3 operator + (const TMat3 &m) const; // M + N
00067 TMat3 operator - (const TMat3 &m) const; // M - N
00068 TMat3 operator - () const; // -M
00069 TMat3 operator * (const TMat3 &m) const; // M * N
00070 TMat3 operator * (TMReal s) const; // M * s
00071 TMat3 operator / (TMReal s) const; // M / s
00072
00073 // Initialisers
00074
00075 Void MakeZero(); // Zero matrix
00076 Void MakeDiag(TMReal k = vl_one); // I
00077 Void MakeBlock(TMReal k = vl_one); // all elts = k
00078
00079 // Vector Transforms
00080
00081 TMat3& MakeRot(const TMVec3 &axis, Real theta);
00082 TMat3& MakeRot(const TMVec4 &q); // Rotate by quaternion
00083 TMat3& MakeScale(const TMVec3 &s);
00084
00085 // Homogeneous Transforms
00086
00087 TMat3& MakeHRot(Real theta); // Rotate by theta rads
00088 TMat3& MakeHScale(const TMVec2 &s); // Scale by s
00089 TMat3& MakeHTrans(const TMVec2 &t); // Translation by t
00090
00091 // Private...
00092
00093 protected:
00094
00095 TMVec3 row[3];
00096 };
00097
00098
00099 // --- Matrix operators -------------------------------------------------------
00100
00101 inline TMVec3 &operator *= (TMVec3 &v, const TMat3 &m); // v *= m
00102 inline TMVec3 operator * (const TMat3 &m, const TMVec3 &v); // m * v
00103 inline TMVec3 operator * (const TMVec3 &v, const TMat3 &m); // v * m
00104 inline TMat3 operator * (const TMReal s, const TMat3 &m); // s * m
00105
00106 TMat3 trans(const TMat3 &m); // Transpose
00107 TMReal trace(const TMat3 &m); // Trace
00108 TMat3 adj(const TMat3 &m); // Adjoint
00109 TMReal det(const TMat3 &m); // Determinant
00110 TMat3 inv(const TMat3 &m); // Inverse
00111 TMat3 oprod(const TMVec3 &a, const TMVec3 &b);
00112 // Outer product
00113
00114 // The xform functions help avoid dependence on whether row or column
00115 // vectors are used to represent points and vectors.
00116 inline TVec3 xform(const TMat3 &m, const TVec3 &v); // Transform of v by m
00117 inline TVec2 xform(const TMat3 &m, const TVec2 &v); // Hom. xform of v by m
00118 inline TMat3 xform(const TMat3 &m, const TMat3 &n); // Xform v -> m(n(v))
00119
00120 ostream &operator << (ostream &s, const TMat3 &m);
00121 istream &operator >> (istream &s, TMat3 &m);
00122
00123
00124 // --- Inlines ----------------------------------------------------------------
00125
00126 inline TMat3::TMat3()
00127 {
00128 }
00129
00130 inline TMVec3 &TMat3::operator [] (Int i)
00131 {
00132 CheckRange(i, 0, 3, "(Mat3::[i]) index out of range");
00133 return(row[i]);
00134 }
00135
00136 inline const TMVec3 &TMat3::operator [] (Int i) const
00137 {
00138 CheckRange(i, 0, 3, "(Mat3::[i]) index out of range");
00139 return(row[i]);
00140 }
00141
00142 inline TMReal *TMat3::Ref() const
00143 {
00144 return((TMReal *) row);
00145 }
00146
00147 inline TMat3::TMat3(ZeroOrOne k)
00148 {
00149 MakeDiag(k);
00150 }
00151
00152 inline TMat3::TMat3(Block k)
00153 {
00154 MakeBlock((ZeroOrOne) k);
00155 }
00156
00157 inline TMat3 &TMat3::operator = (ZeroOrOne k)
00158 {
00159 MakeDiag(k);
00160
00161 return(SELF);
00162 }
00163
00164 inline TMat3 &TMat3::operator = (Block k)
00165 {
00166 MakeBlock((ZeroOrOne) k);
00167
00168 return(SELF);
00169 }
00170
00171 inline TMat3 operator * (const TMReal s, const TMat3 &m)
00172 {
00173 return(m * s);
00174 }
00175
00176 inline TMVec3 operator * (const TMat3 &m, const TMVec3 &v)
00177 {
00178 TMVec3 result;
00179
00180 result[0] = v[0] * m[0][0] + v[1] * m[0][1] + v[2] * m[0][2];
00181 result[1] = v[0] * m[1][0] + v[1] * m[1][1] + v[2] * m[1][2];
00182 result[2] = v[0] * m[2][0] + v[1] * m[2][1] + v[2] * m[2][2];
00183
00184 return(result);
00185 }
00186
00187 inline TMVec3 operator * (const TMVec3 &v, const TMat3 &m)
00188 {
00189 TMVec3 result;
00190
00191 result[0] = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0];
00192 result[1] = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1];
00193 result[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2];
00194
00195 return(result);
00196 }
00197
00198 inline TMVec3 &operator *= (TMVec3 &v, const TMat3 &m)
00199 {
00200 TMReal t0, t1;
00201
00202 t0 = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0];
00203 t1 = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1];
00204 v[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2];
00205 v[0] = t0;
00206 v[1] = t1;
00207
00208 return(v);
00209 }
00210
00211 #ifdef VL_ROW_ORIENT
00212 inline TVec2 xform(const TMat3 &m, const TVec2 &v)
00213 { return(proj(TVec3(v, 1.0) * m)); }
00214 inline TVec3 xform(const TMat3 &m, const TVec3 &v)
00215 { return(v * m); }
00216 inline TMat3 xform(const TMat3 &m, const TMat3 &n)
00217 { return(n * m); }
00218 #else
00219 inline TVec2 xform(const TMat3 &m, const TVec2 &v)
00220 { return(proj(m * TVec3(v, 1.0))); }
00221 inline TVec3 xform(const TMat3 &m, const TVec3 &v)
00222 { return(m * v); }
00223 inline TMat3 xform(const TMat3 &m, const TMat3 &n)
00224 { return(m * n); }
00225 #endif
00226
00227 #endif
00228