Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

t3d.cpp

Go to the documentation of this file.
00001 /*
00002 ** ---------------------------------------------------------------
00003 ** t3d.cpp  -  3D matrix transformations class.
00004 **
00005 ** ---------------------------------------------------------------
00006 */
00007 
00049 /*
00050 ** ---------------------------------------------------------------
00051 ** Global variables and symbols:
00052 */
00053 #include <math.h>
00054 #include "t3d.h"
00055 
00056 /*
00057 ** ---------------------------------------------------------------
00058 ** Initialization of class variables:
00059 */
00062 double T3d::mt[4][4] =
00063  {
00064   { 1.0, 0.0, 0.0, 0.0 } ,
00065   { 0.0, 1.0, 0.0, 0.0 } ,
00066   { 0.0, 0.0, 1.0, 0.0 } ,
00067   { 0.0, 0.0, 0.0, 1.0 }
00068  };
00069 
00070 /*
00071 ** ---------------------------------------------------------------
00072 ** Private class functions:
00073 */
00074 
00075 /*=======================  T3d::Accumulate  ======================*/
00080 void T3d::Accumulate( double new_mt[4][4] )
00081 {
00082  double   t0, t1, t2;
00083 
00084  t0       =  mt[0][0]*new_mt[0][0] + mt[1][0]*new_mt[0][1] 
00085            + mt[2][0]*new_mt[0][2] + mt[3][0]*new_mt[0][3];
00086  t1       =  mt[0][0]*new_mt[1][0] + mt[1][0]*new_mt[1][1] 
00087            + mt[2][0]*new_mt[1][2] + mt[3][0]*new_mt[1][3];
00088  t2       =  mt[0][0]*new_mt[2][0] + mt[1][0]*new_mt[2][1] 
00089            + mt[2][0]*new_mt[2][2] + mt[3][0]*new_mt[2][3];
00090  mt[3][0] =  mt[0][0]*new_mt[3][0] + mt[1][0]*new_mt[3][1] 
00091            + mt[2][0]*new_mt[3][2] + mt[3][0]*new_mt[3][3];
00092  mt[2][0] =  t2;
00093  mt[1][0] =  t1;
00094  mt[0][0] =  t0;
00095 
00096  t0       =  mt[0][1]*new_mt[0][0] + mt[1][1]*new_mt[0][1] 
00097            + mt[2][1]*new_mt[0][2] + mt[3][1]*new_mt[0][3];
00098  t1       =  mt[0][1]*new_mt[1][0] + mt[1][1]*new_mt[1][1] 
00099            + mt[2][1]*new_mt[1][2] + mt[3][1]*new_mt[1][3];
00100  t2       =  mt[0][1]*new_mt[2][0] + mt[1][1]*new_mt[2][1] 
00101            + mt[2][1]*new_mt[2][2] + mt[3][1]*new_mt[2][3];
00102  mt[3][1] =  mt[0][1]*new_mt[3][0] + mt[1][1]*new_mt[3][1] 
00103            + mt[2][1]*new_mt[3][2] + mt[3][1]*new_mt[3][3];
00104  mt[2][1] =  t2;
00105  mt[1][1] =  t1;
00106  mt[0][1] =  t0;
00107 
00108  t0       =  mt[0][2]*new_mt[0][0] + mt[1][2]*new_mt[0][1] 
00109            + mt[2][2]*new_mt[0][2] + mt[3][2]*new_mt[0][3];
00110  t1       =  mt[0][2]*new_mt[1][0] + mt[1][2]*new_mt[1][1] 
00111            + mt[2][2]*new_mt[1][2] + mt[3][2]*new_mt[1][3];
00112  t2       =  mt[0][2]*new_mt[2][0] + mt[1][2]*new_mt[2][1] 
00113            + mt[2][2]*new_mt[2][2] + mt[3][2]*new_mt[2][3];
00114  mt[3][2] =  mt[0][2]*new_mt[3][0] + mt[1][2]*new_mt[3][1] 
00115            + mt[2][2]*new_mt[3][2] + mt[3][2]*new_mt[3][3];
00116  mt[2][2] =  t2;
00117  mt[1][2] =  t1;
00118  mt[0][2] =  t0;
00119 
00120  t0       =  mt[0][3]*new_mt[0][0] + mt[1][3]*new_mt[0][1] 
00121            + mt[2][3]*new_mt[0][2] + mt[3][3]*new_mt[0][3];
00122  t1       =  mt[0][3]*new_mt[1][0] + mt[1][3]*new_mt[1][1] 
00123            + mt[2][3]*new_mt[1][2] + mt[3][3]*new_mt[1][3];
00124  t2       =  mt[0][3]*new_mt[2][0] + mt[1][3]*new_mt[2][1] 
00125            + mt[2][3]*new_mt[2][2] + mt[3][3]*new_mt[2][3];
00126  mt[3][3] =  mt[0][3]*new_mt[3][0] + mt[1][3]*new_mt[3][1] 
00127            + mt[2][3]*new_mt[3][2] + mt[3][3]*new_mt[3][3];
00128  mt[2][3] =  t2;
00129  mt[1][3] =  t1;
00130  mt[0][3] =  t0;
00131 }
00132 
00133 /*
00134 ** ---------------------------------------------------------------
00135 ** Public class functions:
00136 */
00137 /*======================  T3d::Transform  ========================*/
00138 
00139 void T3d::Transform( double* x, double* y, double* z )
00140 {
00141  double r, s, t, h;
00142 
00143   r = mt[0][0]*(*x)+mt[0][1]*(*y)+mt[0][2]*(*z)+mt[0][3];
00144   s = mt[1][0]*(*x)+mt[1][1]*(*y)+mt[1][2]*(*z)+mt[1][3];
00145   t = mt[2][0]*(*x)+mt[2][1]*(*y)+mt[2][2]*(*z)+mt[2][3];
00146   h = mt[3][0]*(*x)+mt[3][1]*(*y)+mt[3][2]*(*z)+mt[3][3];
00147  *x = r/h;
00148  *y = s/h;
00149  *z = t/h;
00150 }
00151 
00152 /*======================  T3d::Identity  ========================= */
00153 
00154 void T3d::Identity( void )
00155 {
00156  mt[0][0] = 1.0; mt[0][1] = 0.0; mt[0][2] = 0.0; mt[0][3] = 0.0;
00157  mt[1][0] = 0.0; mt[1][1] = 1.0; mt[1][2] = 0.0; mt[1][3] = 0.0;
00158  mt[2][0] = 0.0; mt[2][1] = 0.0; mt[2][2] = 1.0; mt[2][3] = 0.0;
00159  mt[3][0] = 0.0; mt[3][1] = 0.0; mt[3][2] = 0.0; mt[3][3] = 1.0;
00160 }
00161 
00162 /*=========================  T3d::Scale  =========================*/
00163 
00164 void T3d::Scale( double sx, double sy, double sz )
00165 {
00166  double scale[4][4];
00167 
00168 /*** COMPLETE HERE: 05 ***/
00169
00170
00171
00172
00173 /*** COMPLETE HERE: 05 ***/
00174 
00175  Accumulate( scale );
00176 }
00177 
00178 /*=======================  T3d::Translate  =======================*/
00179 
00180 void T3d::Translate( double tx, double ty, double tz )
00181 {
00182  double trans[4][4];
00183 
00184 /*** COMPLETE HERE: 06 ***/
00185
00186
00187
00188
00189 /*** COMPLETE HERE: 06 ***/
00190 
00191  Accumulate( trans );
00192 }
00193 
00194 /*======================  T3d::RotateBasis  ======================*/
00195 
00196 void T3d::RotateBasis( double ux, double uy, double uz, 
00197                        double vx, double vy, double vz,
00198                        double wx, double wy, double wz )
00199 {
00200  double rot[4][4];
00201 
00202 /*** COMPLETE HERE: 07 ***/
00203
00204
00205
00206
00207 /*** COMPLETE HERE: 07 ***/
00208 
00209  Accumulate( rot );
00210 }
00211 
00212 /*=========================  T3d::Camera  ========================*/
00213 
00214 void T3d::Camera( double eyex, double eyey, double eyez, 
00215                   double refx, double refy, double refz,
00216                   double vupx, double vupy, double vupz )
00217 {
00218  Vec  view, upvec;   /* view vector and view upper vector */
00219  Vec  u, v, w;       /* eye system unit vectors           */
00220 
00221 /* Define view vector (from ref to eye) and view up vector.
00222  */
00223 /*** COMPLETE HERE: 08 ***/
00224
00225
00226
00227
00228
00229
00230 /*** COMPLETE HERE: 08 ***/
00231 
00232 /* Find the eye system unit vectors.
00233  */
00234 /*** COMPLETE HERE: 09 ***/
00235
00236
00237
00238
00239
00240
00241
00242 /*** COMPLETE HERE: 09 ***/
00243 
00244 /* Concatenate a translation of basis from origin to eye point.
00245  */
00246 /*** COMPLETE HERE: 10 ***/
00247
00248 /*** COMPLETE HERE: 10 ***/
00249 
00250 /* Concatenate a rotation of basis from world to eye system.
00251  */
00252 /*** COMPLETE HERE: 11 ***/
00253
00254 /*** COMPLETE HERE: 11 ***/
00255 }
00256 
00257 /*======================  T3d::Perspective  ======================*/
00258 
00259 void T3d::Perspective( double d, double front, double back )
00260 {
00261  double alpha, beta;        /* perspective parameters */
00262  double pers[4][4];
00263 
00264 /*** COMPLETE HERE: 12 ***/
00265
00266
00267 /*** COMPLETE HERE: 12 ***/
00268 
00269 /*** COMPLETE HERE: 13 ***/
00270
00271
00272
00273
00274 /*** COMPLETE HERE: 13 ***/
00275 
00276  Accumulate( pers );
00277 }
00278 
00279 /*=====================  T3d::NormalizeView  =====================*/
00280 
00281 void T3d::NormalizeView( double left, double right, 
00282                          double bottom, double top, 
00283                          double front, double back )
00284 {
00285  double tx, ty, tz;           /* translation factors */
00286  double sx, sy, sz;           /* scaling factors     */
00287 
00288 /* Concatenate a translation of basis from origin to center
00289  * of view volume.
00290  */
00291 /*** COMPLETE HERE: 14 ***/
00292
00293
00294
00295
00296 /*** COMPLETE HERE: 14 ***/
00297 
00298 /* Concatenate a scaling transformation that scales the view 
00299  * volume to a cube ranging from -1 to +1 in the 3 directions, 
00300  * also reverting the z-axis direction.
00301  */
00302 /*** COMPLETE HERE: 15 ***/
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316 /*** COMPLETE HERE: 15 ***/
00317 }
00318 

Generated on Mon Jun 21 12:45:12 2010 for Trab4 by  doxygen 1.4.2-20050421