<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta name="robots" content="noindex"> <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>algebra3.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body bgcolor="#ffffff"> <!-- Generated by Doxygen 1.2.5 on Mon Oct 14 14:16:35 2002 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>algebra3.h</h1><div class="fragment"><pre>00001 <font class="comment">/****************************************************************</font> 00002 <font class="comment">* *</font> 00003 <font class="comment">* C++ Vector and Matrix Algebra routines *</font> 00004 <font class="comment">* Author: Jean-Francois DOUE *</font> 00005 <font class="comment">* Version 3.1 --- October 1993 *</font> 00006 <font class="comment">* *</font> 00007 <font class="comment">****************************************************************/</font> 00008 00009 <font class="preprocessor">#ifndef _util_misc_algebra_h</font> 00010 <font class="preprocessor"></font><font class="preprocessor">#define _util_misc_algebra_h</font> 00011 <font class="preprocessor"></font> 00012 <font class="preprocessor">#include <iostream></font> 00013 <font class="preprocessor">#include <stdlib.h></font> 00014 00015 <font class="keyword">namespace </font>sc { 00016 00017 <font class="comment">// this line defines a new type: pointer to a function which returns a</font> 00018 <font class="comment">// double and takes as argument a double</font> 00019 <font class="keyword">typedef</font> double (*V_FCT_PTR)(<font class="keywordtype">double</font>); 00020 00021 <font class="keyword">class </font>vec2; 00022 <font class="keyword">class </font>vec3; 00023 <font class="keyword">class </font>vec4; 00024 <font class="keyword">class </font>mat3; 00025 <font class="keyword">class </font>mat4; 00026 00027 <font class="keyword">enum</font> {VX, VY, VZ, VW}; <font class="comment">// axes</font> 00028 <font class="keyword">enum</font> {PA, PB, PC, PD}; <font class="comment">// planes</font> 00029 <font class="keyword">enum</font> {RED, GREEN, BLUE}; <font class="comment">// colors</font> 00030 00031 <font class="comment">/****************************************************************</font> 00032 <font class="comment">* *</font> 00033 <font class="comment">* 2D Vector *</font> 00034 <font class="comment">* *</font> 00035 <font class="comment">****************************************************************/</font> 00036 00037 <font class="keyword">class </font>vec2 00038 { 00039 <font class="keyword">protected</font>: 00040 00041 <font class="keywordtype">double</font> n[2]; 00042 00043 <font class="keyword">public</font>: 00044 00045 <font class="comment">// Constructors</font> 00046 00047 vec2(); 00048 vec2(<font class="keyword">const</font> <font class="keywordtype">double</font> x, <font class="keyword">const</font> <font class="keywordtype">double</font> y); 00049 vec2(<font class="keyword">const</font> <font class="keywordtype">double</font> d); 00050 vec2(<font class="keyword">const</font> vec2& v); <font class="comment">// copy constructor</font> 00051 vec2(<font class="keyword">const</font> vec3& v); <font class="comment">// cast v3 to v2</font> 00052 vec2(<font class="keyword">const</font> vec3& v, <font class="keywordtype">int</font> dropAxis); <font class="comment">// cast v3 to v2</font> 00053 00054 <font class="comment">// Assignment operators</font> 00055 00056 vec2& operator = ( <font class="keyword">const</font> vec2& v ); <font class="comment">// assignment of a vec2</font> 00057 vec2& operator += ( <font class="keyword">const</font> vec2& v ); <font class="comment">// incrementation by a vec2</font> 00058 vec2& operator -= ( <font class="keyword">const</font> vec2& v ); <font class="comment">// decrementation by a vec2</font> 00059 vec2& operator *= ( <font class="keyword">const</font> <font class="keywordtype">double</font> d ); <font class="comment">// multiplication by a constant</font> 00060 vec2& operator /= ( <font class="keyword">const</font> <font class="keywordtype">double</font> d ); <font class="comment">// division by a constant</font> 00061 <font class="keywordtype">double</font>& operator [] ( <font class="keywordtype">int</font> i); <font class="comment">// indexing</font> 00062 <font class="keyword">const</font> <font class="keywordtype">double</font>& operator[](<font class="keywordtype">int</font> i) <font class="keyword">const</font>; <font class="comment">// indexing</font> 00063 00064 <font class="comment">// special functions</font> 00065 00066 <font class="keywordtype">double</font> length(); <font class="comment">// length of a vec2</font> 00067 <font class="keywordtype">double</font> length2(); <font class="comment">// squared length of a vec2</font> 00068 vec2& normalize(); <font class="comment">// normalize a vec2</font> 00069 vec2& apply(V_FCT_PTR fct); <font class="comment">// apply a func. to each component</font> 00070 00071 <font class="comment">// friends</font> 00072 00073 <font class="keyword">friend</font> vec2 operator - (<font class="keyword">const</font> vec2& v); <font class="comment">// -v1</font> 00074 <font class="keyword">friend</font> vec2 operator + (<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> vec2& b); <font class="comment">// v1 + v2</font> 00075 <font class="keyword">friend</font> vec2 operator - (<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> vec2& b); <font class="comment">// v1 - v2</font> 00076 <font class="keyword">friend</font> vec2 operator * (<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// v1 * 3.0</font> 00077 <font class="keyword">friend</font> vec2 operator * (<font class="keyword">const</font> <font class="keywordtype">double</font> d, <font class="keyword">const</font> vec2& a); <font class="comment">// 3.0 * v1</font> 00078 <font class="keyword">friend</font> vec2 operator * (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> vec2& v); <font class="comment">// M . v</font> 00079 <font class="keyword">friend</font> vec2 operator * (<font class="keyword">const</font> vec2& v, mat3& a); <font class="comment">// v . M</font> 00080 <font class="keyword">friend</font> <font class="keywordtype">double</font> operator * (<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> vec2& b); <font class="comment">// dot product</font> 00081 <font class="keyword">friend</font> vec2 operator / (<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// v1 / 3.0</font> 00082 <font class="keyword">friend</font> vec3 operator ^ (<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> vec2& b); <font class="comment">// cross product</font> 00083 <font class="keyword">friend</font> <font class="keywordtype">int</font> operator == (<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> vec2& b); <font class="comment">// v1 == v2 ?</font> 00084 <font class="keyword">friend</font> <font class="keywordtype">int</font> operator != (<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> vec2& b); <font class="comment">// v1 != v2 ?</font> 00085 <font class="keyword">friend</font> std::ostream& operator << (std::ostream& s, vec2& v);<font class="comment">// output to stream</font> 00086 <font class="keyword">friend</font> std::istream& operator >> (std::istream& s, vec2& v);<font class="comment">// input from strm.</font> 00087 <font class="keyword">friend</font> <font class="keywordtype">void</font> swap(vec2& a, vec2& b); <font class="comment">// swap v1 & v2</font> 00088 <font class="keyword">friend</font> vec2 min(<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> vec2& b); <font class="comment">// min(v1, v2)</font> 00089 <font class="keyword">friend</font> vec2 max(<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> vec2& b); <font class="comment">// max(v1, v2)</font> 00090 <font class="keyword">friend</font> vec2 prod(<font class="keyword">const</font> vec2& a, <font class="keyword">const</font> vec2& b); <font class="comment">// term by term *</font> 00091 00092 <font class="comment">// necessary friend declarations</font> 00093 00094 <font class="keyword">friend</font> <font class="keyword">class </font>vec3; 00095 }; 00096 00097 <font class="comment">/****************************************************************</font> 00098 <font class="comment">* *</font> 00099 <font class="comment">* 3D Vector *</font> 00100 <font class="comment">* *</font> 00101 <font class="comment">****************************************************************/</font> 00102 00103 <font class="keyword">class </font>vec3 00104 { 00105 <font class="keyword">protected</font>: 00106 00107 <font class="keywordtype">double</font> n[3]; 00108 00109 <font class="keyword">public</font>: 00110 00111 <font class="comment">// Constructors</font> 00112 00113 vec3(); 00114 vec3(<font class="keyword">const</font> <font class="keywordtype">double</font> x, <font class="keyword">const</font> <font class="keywordtype">double</font> y, <font class="keyword">const</font> <font class="keywordtype">double</font> z); 00115 vec3(<font class="keyword">const</font> <font class="keywordtype">double</font> d); 00116 vec3(<font class="keyword">const</font> vec3& v); <font class="comment">// copy constructor</font> 00117 vec3(<font class="keyword">const</font> vec2& v); <font class="comment">// cast v2 to v3</font> 00118 vec3(<font class="keyword">const</font> vec2& v, <font class="keywordtype">double</font> d); <font class="comment">// cast v2 to v3</font> 00119 vec3(<font class="keyword">const</font> vec4& v); <font class="comment">// cast v4 to v3</font> 00120 vec3(<font class="keyword">const</font> vec4& v, <font class="keywordtype">int</font> dropAxis); <font class="comment">// cast v4 to v3</font> 00121 00122 <font class="comment">// Assignment operators</font> 00123 00124 vec3& operator = ( <font class="keyword">const</font> vec3& v ); <font class="comment">// assignment of a vec3</font> 00125 vec3& operator += ( <font class="keyword">const</font> vec3& v ); <font class="comment">// incrementation by a vec3</font> 00126 vec3& operator -= ( <font class="keyword">const</font> vec3& v ); <font class="comment">// decrementation by a vec3</font> 00127 vec3& operator *= ( <font class="keyword">const</font> <font class="keywordtype">double</font> d ); <font class="comment">// multiplication by a constant</font> 00128 vec3& operator /= ( <font class="keyword">const</font> <font class="keywordtype">double</font> d ); <font class="comment">// division by a constant</font> 00129 <font class="keywordtype">double</font>& operator [] ( <font class="keywordtype">int</font> i); <font class="comment">// indexing</font> 00130 <font class="keyword">const</font> <font class="keywordtype">double</font>& operator[](<font class="keywordtype">int</font> i) <font class="keyword">const</font>; <font class="comment">// indexing</font> 00131 00132 <font class="comment">// special functions</font> 00133 00134 <font class="keywordtype">double</font> length(); <font class="comment">// length of a vec3</font> 00135 <font class="keywordtype">double</font> length2(); <font class="comment">// squared length of a vec3</font> 00136 vec3& normalize(); <font class="comment">// normalize a vec3</font> 00137 vec3& apply(V_FCT_PTR fct); <font class="comment">// apply a func. to each component</font> 00138 00139 <font class="comment">// friends</font> 00140 00141 <font class="keyword">friend</font> vec3 operator - (<font class="keyword">const</font> vec3& v); <font class="comment">// -v1</font> 00142 <font class="keyword">friend</font> vec3 operator + (<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> vec3& b); <font class="comment">// v1 + v2</font> 00143 <font class="keyword">friend</font> vec3 operator - (<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> vec3& b); <font class="comment">// v1 - v2</font> 00144 <font class="keyword">friend</font> vec3 operator * (<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// v1 * 3.0</font> 00145 <font class="keyword">friend</font> vec3 operator * (<font class="keyword">const</font> <font class="keywordtype">double</font> d, <font class="keyword">const</font> vec3& a); <font class="comment">// 3.0 * v1</font> 00146 <font class="keyword">friend</font> vec3 operator * (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> vec3& v); <font class="comment">// M . v</font> 00147 <font class="keyword">friend</font> vec3 operator * (<font class="keyword">const</font> vec3& v, <font class="keyword">const</font> mat4& a); <font class="comment">// v . M</font> 00148 <font class="keyword">friend</font> <font class="keywordtype">double</font> operator * (<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> vec3& b); <font class="comment">// dot product</font> 00149 <font class="keyword">friend</font> vec3 operator / (<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// v1 / 3.0</font> 00150 <font class="keyword">friend</font> vec3 operator ^ (<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> vec3& b); <font class="comment">// cross product</font> 00151 <font class="keyword">friend</font> <font class="keywordtype">int</font> operator == (<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> vec3& b); <font class="comment">// v1 == v2 ?</font> 00152 <font class="keyword">friend</font> <font class="keywordtype">int</font> operator != (<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> vec3& b); <font class="comment">// v1 != v2 ?</font> 00153 <font class="keyword">friend</font> std::ostream& operator << (std::ostream& s, vec3& v);<font class="comment">// output to stream</font> 00154 <font class="keyword">friend</font> std::istream& operator >> (std::istream& s, vec3& v);<font class="comment">// input from strm.</font> 00155 <font class="keyword">friend</font> <font class="keywordtype">void</font> swap(vec3& a, vec3& b); <font class="comment">// swap v1 & v2</font> 00156 <font class="keyword">friend</font> vec3 min(<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> vec3& b); <font class="comment">// min(v1, v2)</font> 00157 <font class="keyword">friend</font> vec3 max(<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> vec3& b); <font class="comment">// max(v1, v2)</font> 00158 <font class="keyword">friend</font> vec3 prod(<font class="keyword">const</font> vec3& a, <font class="keyword">const</font> vec3& b); <font class="comment">// term by term *</font> 00159 00160 <font class="comment">// necessary friend declarations</font> 00161 00162 <font class="keyword">friend</font> <font class="keyword">class </font>vec2; 00163 <font class="keyword">friend</font> <font class="keyword">class </font>vec4; 00164 <font class="keyword">friend</font> <font class="keyword">class </font>mat3; 00165 <font class="keyword">friend</font> vec2 operator * (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> vec2& v); <font class="comment">// linear transform</font> 00166 <font class="keyword">friend</font> mat3 operator * (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> mat3& b); <font class="comment">// matrix 3 product</font> 00167 }; 00168 00169 <font class="comment">/****************************************************************</font> 00170 <font class="comment">* *</font> 00171 <font class="comment">* 4D Vector *</font> 00172 <font class="comment">* *</font> 00173 <font class="comment">****************************************************************/</font> 00174 00175 <font class="keyword">class </font>vec4 00176 { 00177 <font class="keyword">protected</font>: 00178 00179 <font class="keywordtype">double</font> n[4]; 00180 00181 <font class="keyword">public</font>: 00182 00183 <font class="comment">// Constructors</font> 00184 00185 vec4(); 00186 vec4(<font class="keyword">const</font> <font class="keywordtype">double</font> x, <font class="keyword">const</font> <font class="keywordtype">double</font> y, <font class="keyword">const</font> <font class="keywordtype">double</font> z, <font class="keyword">const</font> <font class="keywordtype">double</font> w); 00187 vec4(<font class="keyword">const</font> <font class="keywordtype">double</font> d); 00188 vec4(<font class="keyword">const</font> vec4& v); <font class="comment">// copy constructor</font> 00189 vec4(<font class="keyword">const</font> vec3& v); <font class="comment">// cast vec3 to vec4</font> 00190 vec4(<font class="keyword">const</font> vec3& v, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// cast vec3 to vec4</font> 00191 00192 <font class="comment">// Assignment operators</font> 00193 00194 vec4& operator = ( <font class="keyword">const</font> vec4& v ); <font class="comment">// assignment of a vec4</font> 00195 vec4& operator += ( <font class="keyword">const</font> vec4& v ); <font class="comment">// incrementation by a vec4</font> 00196 vec4& operator -= ( <font class="keyword">const</font> vec4& v ); <font class="comment">// decrementation by a vec4</font> 00197 vec4& operator *= ( <font class="keyword">const</font> <font class="keywordtype">double</font> d ); <font class="comment">// multiplication by a constant</font> 00198 vec4& operator /= ( <font class="keyword">const</font> <font class="keywordtype">double</font> d ); <font class="comment">// division by a constant</font> 00199 <font class="keywordtype">double</font>& operator [] ( <font class="keywordtype">int</font> i); <font class="comment">// indexing</font> 00200 <font class="keyword">const</font> <font class="keywordtype">double</font>& operator [] ( <font class="keywordtype">int</font> i) <font class="keyword">const</font>; <font class="comment">// indexing</font> 00201 00202 <font class="comment">// special functions</font> 00203 00204 <font class="keywordtype">double</font> length(); <font class="comment">// length of a vec4</font> 00205 <font class="keywordtype">double</font> length2(); <font class="comment">// squared length of a vec4</font> 00206 vec4& normalize(); <font class="comment">// normalize a vec4</font> 00207 vec4& apply(V_FCT_PTR fct); <font class="comment">// apply a func. to each component</font> 00208 00209 <font class="comment">// friends</font> 00210 00211 <font class="keyword">friend</font> vec4 operator - (<font class="keyword">const</font> vec4& v); <font class="comment">// -v1</font> 00212 <font class="keyword">friend</font> vec4 operator + (<font class="keyword">const</font> vec4& a, <font class="keyword">const</font> vec4& b); <font class="comment">// v1 + v2</font> 00213 <font class="keyword">friend</font> vec4 operator - (<font class="keyword">const</font> vec4& a, <font class="keyword">const</font> vec4& b); <font class="comment">// v1 - v2</font> 00214 <font class="keyword">friend</font> vec4 operator * (<font class="keyword">const</font> vec4& a, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// v1 * 3.0</font> 00215 <font class="keyword">friend</font> vec4 operator * (<font class="keyword">const</font> <font class="keywordtype">double</font> d, <font class="keyword">const</font> vec4& a); <font class="comment">// 3.0 * v1</font> 00216 <font class="keyword">friend</font> vec4 operator * (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> vec4& v); <font class="comment">// M . v</font> 00217 <font class="keyword">friend</font> vec4 operator * (<font class="keyword">const</font> vec4& v, <font class="keyword">const</font> mat4& a); <font class="comment">// v . M</font> 00218 <font class="keyword">friend</font> <font class="keywordtype">double</font> operator * (<font class="keyword">const</font> vec4& a, <font class="keyword">const</font> vec4& b); <font class="comment">// dot product</font> 00219 <font class="keyword">friend</font> vec4 operator / (<font class="keyword">const</font> vec4& a, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// v1 / 3.0</font> 00220 <font class="keyword">friend</font> <font class="keywordtype">int</font> operator == (<font class="keyword">const</font> vec4& a, <font class="keyword">const</font> vec4& b); <font class="comment">// v1 == v2 ?</font> 00221 <font class="keyword">friend</font> <font class="keywordtype">int</font> operator != (<font class="keyword">const</font> vec4& a, <font class="keyword">const</font> vec4& b); <font class="comment">// v1 != v2 ?</font> 00222 <font class="keyword">friend</font> std::ostream& operator << (std::ostream& s, vec4& v);<font class="comment">// output to stream</font> 00223 <font class="keyword">friend</font> std::istream& operator >> (std::istream& s, vec4& v);<font class="comment">// input from strm.</font> 00224 <font class="keyword">friend</font> <font class="keywordtype">void</font> swap(vec4& a, vec4& b); <font class="comment">// swap v1 & v2</font> 00225 <font class="keyword">friend</font> vec4 min(<font class="keyword">const</font> vec4& a, <font class="keyword">const</font> vec4& b); <font class="comment">// min(v1, v2)</font> 00226 <font class="keyword">friend</font> vec4 max(<font class="keyword">const</font> vec4& a, <font class="keyword">const</font> vec4& b); <font class="comment">// max(v1, v2)</font> 00227 <font class="keyword">friend</font> vec4 prod(<font class="keyword">const</font> vec4& a, <font class="keyword">const</font> vec4& b); <font class="comment">// term by term *</font> 00228 00229 <font class="comment">// necessary friend declarations</font> 00230 00231 <font class="keyword">friend</font> <font class="keyword">class </font>vec3; 00232 <font class="keyword">friend</font> <font class="keyword">class </font>mat4; 00233 <font class="keyword">friend</font> vec3 operator * (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> vec3& v); <font class="comment">// linear transform</font> 00234 <font class="keyword">friend</font> mat4 operator * (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> mat4& b); <font class="comment">// matrix 4 product</font> 00235 }; 00236 00237 <font class="comment">/****************************************************************</font> 00238 <font class="comment">* *</font> 00239 <font class="comment">* 3x3 Matrix *</font> 00240 <font class="comment">* *</font> 00241 <font class="comment">****************************************************************/</font> 00242 00243 <font class="keyword">class </font>mat3 00244 { 00245 <font class="keyword">protected</font>: 00246 00247 vec3 v[3]; 00248 00249 <font class="keyword">public</font>: 00250 00251 <font class="comment">// Constructors</font> 00252 00253 mat3(); 00254 mat3(<font class="keyword">const</font> vec3& v0, <font class="keyword">const</font> vec3& v1, <font class="keyword">const</font> vec3& v2); 00255 mat3(<font class="keyword">const</font> <font class="keywordtype">double</font> d); 00256 mat3(<font class="keyword">const</font> mat3& m); 00257 00258 <font class="comment">// Assignment operators</font> 00259 00260 mat3& operator = ( <font class="keyword">const</font> mat3& m ); <font class="comment">// assignment of a mat3</font> 00261 mat3& operator += ( <font class="keyword">const</font> mat3& m ); <font class="comment">// incrementation by a mat3</font> 00262 mat3& operator -= ( <font class="keyword">const</font> mat3& m ); <font class="comment">// decrementation by a mat3</font> 00263 mat3& operator *= ( <font class="keyword">const</font> <font class="keywordtype">double</font> d ); <font class="comment">// multiplication by a constant</font> 00264 mat3& operator /= ( <font class="keyword">const</font> <font class="keywordtype">double</font> d ); <font class="comment">// division by a constant</font> 00265 vec3& operator [] ( <font class="keywordtype">int</font> i); <font class="comment">// indexing</font> 00266 <font class="keyword">const</font> vec3& operator [] ( <font class="keywordtype">int</font> i) <font class="keyword">const</font>; <font class="comment">// indexing</font> 00267 00268 <font class="comment">// special functions</font> 00269 00270 mat3 transpose() <font class="keyword">const</font>; <font class="comment">// transpose</font> 00271 mat3 inverse(); <font class="comment">// inverse</font> 00272 mat3& apply(V_FCT_PTR fct); <font class="comment">// apply a func. to each element</font> 00273 00274 <font class="comment">// friends</font> 00275 00276 <font class="keyword">friend</font> mat3 operator - (<font class="keyword">const</font> mat3& a); <font class="comment">// -m1</font> 00277 <font class="keyword">friend</font> mat3 operator + (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> mat3& b); <font class="comment">// m1 + m2</font> 00278 <font class="keyword">friend</font> mat3 operator - (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> mat3& b); <font class="comment">// m1 - m2</font> 00279 <font class="keyword">friend</font> mat3 operator * (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> mat3& b); <font class="comment">// m1 * m2</font> 00280 <font class="keyword">friend</font> mat3 operator * (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// m1 * 3.0</font> 00281 <font class="keyword">friend</font> mat3 operator * (<font class="keyword">const</font> <font class="keywordtype">double</font> d, <font class="keyword">const</font> mat3& a); <font class="comment">// 3.0 * m1</font> 00282 <font class="keyword">friend</font> mat3 operator / (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// m1 / 3.0</font> 00283 <font class="keyword">friend</font> <font class="keywordtype">int</font> operator == (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> mat3& b); <font class="comment">// m1 == m2 ?</font> 00284 <font class="keyword">friend</font> <font class="keywordtype">int</font> operator != (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> mat3& b); <font class="comment">// m1 != m2 ?</font> 00285 <font class="keyword">friend</font> std::ostream& operator << (std::ostream& s, mat3& m);<font class="comment">// output to stream</font> 00286 <font class="keyword">friend</font> std::istream& operator >> (std::istream& s, mat3& m);<font class="comment">// input from strm.</font> 00287 <font class="keyword">friend</font> <font class="keywordtype">void</font> swap(mat3& a, mat3& b); <font class="comment">// swap m1 & m2</font> 00288 00289 <font class="comment">// necessary friend declarations</font> 00290 00291 <font class="keyword">friend</font> vec3 operator * (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> vec3& v); <font class="comment">// linear transform</font> 00292 <font class="keyword">friend</font> vec2 operator * (<font class="keyword">const</font> mat3& a, <font class="keyword">const</font> vec2& v); <font class="comment">// linear transform</font> 00293 }; 00294 00295 <font class="comment">/****************************************************************</font> 00296 <font class="comment">* *</font> 00297 <font class="comment">* 4x4 Matrix *</font> 00298 <font class="comment">* *</font> 00299 <font class="comment">****************************************************************/</font> 00300 00301 <font class="keyword">class </font>mat4 00302 { 00303 <font class="keyword">protected</font>: 00304 00305 vec4 v[4]; 00306 00307 <font class="keyword">public</font>: 00308 00309 <font class="comment">// Constructors</font> 00310 00311 mat4(); 00312 mat4(<font class="keyword">const</font> vec4& v0, <font class="keyword">const</font> vec4& v1, <font class="keyword">const</font> vec4& v2, <font class="keyword">const</font> vec4& v3); 00313 mat4(<font class="keyword">const</font> <font class="keywordtype">double</font> d); 00314 mat4(<font class="keyword">const</font> mat4& m); 00315 00316 <font class="comment">// Assignment operators</font> 00317 00318 mat4& operator = ( <font class="keyword">const</font> mat4& m ); <font class="comment">// assignment of a mat4</font> 00319 mat4& operator += ( <font class="keyword">const</font> mat4& m ); <font class="comment">// incrementation by a mat4</font> 00320 mat4& operator -= ( <font class="keyword">const</font> mat4& m ); <font class="comment">// decrementation by a mat4</font> 00321 mat4& operator *= ( <font class="keyword">const</font> <font class="keywordtype">double</font> d ); <font class="comment">// multiplication by a constant</font> 00322 mat4& operator /= ( <font class="keyword">const</font> <font class="keywordtype">double</font> d ); <font class="comment">// division by a constant</font> 00323 vec4& operator [] ( <font class="keywordtype">int</font> i); <font class="comment">// indexing</font> 00324 <font class="keyword">const</font> vec4& operator [] ( <font class="keywordtype">int</font> i) <font class="keyword">const</font>; <font class="comment">// indexing</font> 00325 00326 <font class="comment">// special functions</font> 00327 00328 mat4 transpose() <font class="keyword">const</font>; <font class="comment">// transpose</font> 00329 mat4 inverse(); <font class="comment">// inverse</font> 00330 mat4& apply(V_FCT_PTR fct); <font class="comment">// apply a func. to each element</font> 00331 00332 <font class="comment">// friends</font> 00333 00334 <font class="keyword">friend</font> mat4 operator - (<font class="keyword">const</font> mat4& a); <font class="comment">// -m1</font> 00335 <font class="keyword">friend</font> mat4 operator + (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> mat4& b); <font class="comment">// m1 + m2</font> 00336 <font class="keyword">friend</font> mat4 operator - (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> mat4& b); <font class="comment">// m1 - m2</font> 00337 <font class="keyword">friend</font> mat4 operator * (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> mat4& b); <font class="comment">// m1 * m2</font> 00338 <font class="keyword">friend</font> mat4 operator * (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// m1 * 4.0</font> 00339 <font class="keyword">friend</font> mat4 operator * (<font class="keyword">const</font> <font class="keywordtype">double</font> d, <font class="keyword">const</font> mat4& a); <font class="comment">// 4.0 * m1</font> 00340 <font class="keyword">friend</font> mat4 operator / (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// m1 / 3.0</font> 00341 <font class="keyword">friend</font> <font class="keywordtype">int</font> operator == (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> mat4& b); <font class="comment">// m1 == m2 ?</font> 00342 <font class="keyword">friend</font> <font class="keywordtype">int</font> operator != (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> mat4& b); <font class="comment">// m1 != m2 ?</font> 00343 <font class="keyword">friend</font> std::ostream& operator << (std::ostream& s, mat4& m);<font class="comment">// output to stream</font> 00344 <font class="keyword">friend</font> std::istream& operator >> (std::istream& s, mat4& m);<font class="comment">// input from strm.</font> 00345 <font class="keyword">friend</font> <font class="keywordtype">void</font> swap(mat4& a, mat4& b); <font class="comment">// swap m1 & m2</font> 00346 00347 <font class="comment">// necessary friend declarations</font> 00348 00349 <font class="keyword">friend</font> vec4 operator * (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> vec4& v); <font class="comment">// linear transform</font> 00350 <font class="keyword">friend</font> vec3 operator * (<font class="keyword">const</font> mat4& a, <font class="keyword">const</font> vec3& v); <font class="comment">// linear transform</font> 00351 }; 00352 00353 <font class="comment">/****************************************************************</font> 00354 <font class="comment">* *</font> 00355 <font class="comment">* 2D functions and 3D functions *</font> 00356 <font class="comment">* *</font> 00357 <font class="comment">****************************************************************/</font> 00358 00359 mat3 identity2D(); <font class="comment">// identity 2D</font> 00360 mat3 translation2D(<font class="keyword">const</font> vec2& v); <font class="comment">// translation 2D</font> 00361 mat3 rotation2D(<font class="keyword">const</font> vec2& Center, <font class="keyword">const</font> <font class="keywordtype">double</font> angleDeg); <font class="comment">// rotation 2D</font> 00362 mat3 scaling2D(<font class="keyword">const</font> vec2& scaleVector); <font class="comment">// scaling 2D</font> 00363 mat4 identity3D(); <font class="comment">// identity 3D</font> 00364 mat4 translation3D(<font class="keyword">const</font> vec3& v); <font class="comment">// translation 3D</font> 00365 mat4 rotation3D(<font class="keyword">const</font> vec3& Axis, <font class="keyword">const</font> <font class="keywordtype">double</font> angleDeg); <font class="comment">// rotation 3D</font> 00366 mat4 scaling3D(<font class="keyword">const</font> vec3& scaleVector); <font class="comment">// scaling 3D</font> 00367 mat4 perspective3D(<font class="keyword">const</font> <font class="keywordtype">double</font> d); <font class="comment">// perspective 3D</font> 00368 00369 } 00370 00371 <font class="preprocessor">#endif</font> </font></div></pre><hr> <address> <small> Generated at Mon Oct 14 14:16:35 2002 for <a href="http://aros.ca.sandia.gov/~cljanss/mpqc">MPQC</a> 2.1.2 using the documentation package <a href="http://www.stack.nl/~dimitri/doxygen/index.html">Doxygen</a> 1.2.5. </small> </address> </body> </html>