![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /**
00002 * MOAB, a Mesh-Oriented datABase, is a software component for creating,
00003 * storing and accessing finite element mesh data.
00004 *
00005 * Copyright 2004 Sandia Corporation. Under the terms of Contract
00006 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
00007 * retains certain rights in this software.
00008 *
00009 * This library is free software; you can redistribute it and/or
00010 * modify it under the terms of the GNU Lesser General Public
00011 * License as published by the Free Software Foundation; either
00012 * version 2.1 of the License, or (at your option) any later version.
00013 *
00014 */
00015
00016 #ifndef MOAB_HOMXFORM
00017 #define MOAB_HOMXFORM
00018
00019 /*
00020 * \file HomXform.hpp
00021 *
00022 * \brief Representation and functions for homogeneous transforms
00023 *
00024 * A homogeneous transform is a 4x4 matrix for representing and manipulating
00025 * homogeneous coordinates, which are x' = (x/h, y/h, z/h, h). See Mortenson,
00026 * Geometric Modeling, or other texts on geometric modeling for details of homogeneous
00027 * transforms.
00028 */
00029
00030 #define XFORM( a, b ) xForm[4 * ( a ) + ( b )]
00031 #define XFORM_INDEX( a, b ) ( 4 * ( a ) + ( b ) )
00032
00033 #include
00034 #include
00035
00036 #include
00037
00038 #include "moab/win32_config.h"
00039
00040 namespace moab
00041 {
00042
00043 class HomXform;
00044
00045 /** \class HomCoord
00046 * \brief Homogeneous coordinate vector
00047 */
00048 class HomCoord
00049 {
00050 private:
00051 //! coordinate data
00052 #if defined( __INTEL_COMPILER ) && ( __INTEL_COMPILER < 1310 )
00053 // Hack Intel compiler 12 issues with -O2 optimization
00054 int homCoord[5];
00055 #else
00056 int homCoord[4];
00057 #endif
00058
00059 public:
00060 friend class HomXform;
00061
00062 static MOAB_EXPORT HomCoord unitv[3];
00063 static MOAB_EXPORT HomCoord IDENTITY;
00064
00065 //! constructors
00066 HomCoord();
00067 HomCoord( const int coords[], const int num_coords = 4 );
00068 HomCoord( const int coord0, const int coord1, const int coord2, const int coord3 );
00069 HomCoord( const int coord0, const int coord1, const int coord2 );
00070 HomCoord( const HomCoord& coord );
00071
00072 //! set function
00073 void set( const int coords[] );
00074 void set( const int i, const int j, const int k, const int h = 1 );
00075
00076 //! get function
00077 const int* hom_coord() const
00078 {
00079 return homCoord;
00080 }
00081
00082 // Getters needed for share windows
00083 static HomCoord& getUnitv( int c );
00084
00085 //! parameter-based access functions
00086 int i() const
00087 {
00088 return homCoord[0];
00089 }
00090 int j() const
00091 {
00092 return homCoord[1];
00093 }
00094 int k() const
00095 {
00096 return homCoord[2];
00097 }
00098 int h() const
00099 {
00100 return homCoord[3];
00101 }
00102
00103 //! squared length
00104 int length_squared() const;
00105
00106 //! length
00107 int length() const;
00108
00109 //! normalize
00110 void normalize();
00111
00112 //! operators
00113 HomCoord& operator*=( const HomXform& rhs2 );
00114 HomCoord operator*( const HomXform& rhs2 ) const;
00115 HomCoord& operator*=( const int mult );
00116 HomCoord operator*( const int mult ) const;
00117 inline HomCoord& operator/=( const HomXform& rhs2 );
00118 HomCoord operator/( const HomXform& rhs2 ) const;
00119 inline HomCoord& operator/=( const int mult );
00120 HomCoord operator/( const int mult ) const;
00121 inline HomCoord& operator+=( const HomCoord& rhs1 );
00122 HomCoord operator+( const HomCoord& rhs1 ) const;
00123 inline HomCoord& operator-=( const HomCoord& rhs1 );
00124 HomCoord operator-( const HomCoord& rhs1 ) const;
00125 HomCoord& operator=( const HomCoord& rhs );
00126
00127 // dot product
00128 int operator%( const HomCoord& rhs ) const;
00129
00130 // cross product
00131 HomCoord operator*( const HomCoord& rhs ) const;
00132 HomCoord& operator*=( const HomCoord& rhs );
00133
00134 bool operator==( const HomCoord& rhs1 ) const;
00135 bool operator!=( const HomCoord& rhs1 ) const;
00136 bool operator>=( const HomCoord& rhs1 ) const;
00137 bool operator<=( const HomCoord& rhs1 ) const;
00138 bool operator>( const HomCoord& rhs1 ) const;
00139 bool operator<( const HomCoord& rhs1 ) const;
00140 inline int operator[]( const int& param ) const;
00141 int& operator[]( const int& param );
00142 };
00143
00144 /** \class HomXform
00145 * \brief Homogeneous coordinate transformation matrix
00146 */
00147 class HomXform
00148 {
00149
00150 private:
00151 //! the matrix; don't bother storing the last column, since we assume for now it's
00152 //! always unused
00153 int xForm[16];
00154
00155 public:
00156 friend class HomCoord;
00157
00158 static MOAB_EXPORT HomXform IDENTITY;
00159
00160 //! constructor from matrix
00161 HomXform( const int matrix[16] );
00162
00163 //! bare constructor
00164 HomXform();
00165
00166 //! constructor from rotation, scaling, translation
00167 HomXform( const int rotate[9], const int scale[3], const int translate[3] );
00168
00169 //! constructor taking 16 ints, useful for efficient operators
00170 HomXform( int i1,
00171 int i2,
00172 int i3,
00173 int i4,
00174 int i5,
00175 int i6,
00176 int i7,
00177 int i8,
00178 int i9,
00179 int i10,
00180 int i11,
00181 int i12,
00182 int i13,
00183 int i14,
00184 int i15,
00185 int i16 );
00186
00187 //! copy constructor
00188 HomXform( HomXform const& from )
00189 {
00190 std::copy( from.xForm, from.xForm + 16, xForm );
00191 }
00192
00193 //! return this.inverse
00194 inline HomXform inverse() const;
00195
00196 //! compute a transform from three points
00197 void three_pt_xform( const HomCoord& p1,
00198 const HomCoord& q1,
00199 const HomCoord& p2,
00200 const HomCoord& q2,
00201 const HomCoord& p3,
00202 const HomCoord& q3 );
00203
00204 //! operators
00205 int operator[]( const int& count ) const;
00206 int& operator[]( const int& count );
00207 bool operator==( const HomXform& rhs ) const;
00208 bool operator!=( const HomXform& rhs ) const;
00209
00210 HomXform& operator=( const HomXform& rhs );
00211 HomXform& operator*=( const HomXform& rhs );
00212 HomXform operator*( const HomXform& rhs2 ) const;
00213 };
00214
00215 inline HomCoord::HomCoord()
00216 {
00217 homCoord[0] = 0;
00218 homCoord[1] = 0;
00219 homCoord[2] = 0;
00220 homCoord[3] = 0;
00221 }
00222
00223 inline HomCoord::HomCoord( const int coords[], const int num_coords )
00224 {
00225 for( int tmpj = 0; tmpj < num_coords; tmpj++ )
00226 homCoord[tmpj] = coords[tmpj];
00227 if( num_coords != 4 ) homCoord[3] = 1;
00228 }
00229
00230 inline HomCoord::HomCoord( const int coord0, const int coord1, const int coord2, const int coord3 )
00231 {
00232 homCoord[0] = coord0;
00233 homCoord[1] = coord1;
00234 homCoord[2] = coord2;
00235 homCoord[3] = coord3;
00236 }
00237
00238 inline HomCoord::HomCoord( const int coord0, const int coord1, const int coord2 )
00239 {
00240 homCoord[0] = coord0;
00241 homCoord[1] = coord1;
00242 homCoord[2] = coord2;
00243 homCoord[3] = 1;
00244 }
00245
00246 inline HomCoord::HomCoord( const HomCoord& coords )
00247 {
00248 #if defined( __INTEL_COMPILER ) && ( __INTEL_COMPILER < 1310 )
00249 // Hack Intel compiler 12 issues with -O2 optimization
00250 int coord0 = coords[0];
00251 int coord1 = coords[1];
00252 int coord2 = coords[2];
00253 int coord3 = coords[3];
00254 homCoord[0] = coord0;
00255 homCoord[1] = coord1;
00256 homCoord[2] = coord2;
00257 homCoord[3] = coord3;
00258 #else
00259 homCoord[0] = coords[0];
00260 homCoord[1] = coords[1];
00261 homCoord[2] = coords[2];
00262 homCoord[3] = coords[3];
00263 #endif
00264 }
00265
00266 inline void HomCoord::set( const int coords[] )
00267 {
00268 homCoord[0] = coords[0];
00269 homCoord[1] = coords[1];
00270 homCoord[2] = coords[2];
00271 homCoord[3] = coords[3];
00272 }
00273
00274 inline void HomCoord::set( const int ip, const int jp, const int kp, const int hp )
00275 {
00276 homCoord[0] = ip;
00277 homCoord[1] = jp;
00278 homCoord[2] = kp;
00279 homCoord[3] = hp;
00280 }
00281
00282 inline HomCoord& HomCoord::operator=( const HomCoord& rhs1 )
00283 {
00284 homCoord[0] = rhs1.homCoord[0];
00285 homCoord[1] = rhs1.homCoord[1];
00286 homCoord[2] = rhs1.homCoord[2];
00287 homCoord[3] = rhs1.homCoord[3];
00288 return *this;
00289 }
00290
00291 //! squared length
00292 inline int HomCoord::length_squared() const
00293 {
00294 return homCoord[0] * homCoord[0] + homCoord[1] * homCoord[1] + homCoord[2] * homCoord[2];
00295 }
00296
00297 //! length
00298 inline int HomCoord::length() const
00299 {
00300 return (int)std::sqrt( (float)length_squared() );
00301 }
00302
00303 //! normalize
00304 inline void HomCoord::normalize()
00305 {
00306 *this /= length();
00307 }
00308
00309 // dot product
00310 inline int HomCoord::operator%( const HomCoord& rhs ) const
00311 {
00312 return homCoord[0] * rhs.homCoord[0] + homCoord[1] * rhs.homCoord[1] + homCoord[2] * rhs.homCoord[2];
00313 }
00314
00315 // cross product
00316 inline HomCoord HomCoord::operator*( const HomCoord& rhs ) const
00317 {
00318 return HomCoord( homCoord[1] * rhs.homCoord[2] - homCoord[2] * rhs.homCoord[1],
00319 homCoord[2] * rhs.homCoord[0] - homCoord[0] * rhs.homCoord[2],
00320 homCoord[0] * rhs.homCoord[1] - homCoord[1] * rhs.homCoord[0] );
00321 }
00322
00323 inline HomCoord& HomCoord::operator*=( const HomCoord& rhs )
00324 {
00325 *this = HomCoord( homCoord[1] * rhs.homCoord[2] - homCoord[2] * rhs.homCoord[1],
00326 homCoord[2] * rhs.homCoord[0] - homCoord[0] * rhs.homCoord[2],
00327 homCoord[0] * rhs.homCoord[1] - homCoord[1] * rhs.homCoord[0] );
00328
00329 return *this;
00330 }
00331
00332 inline bool HomCoord::operator==( const HomCoord& rhs1 ) const
00333 {
00334 return ( homCoord[0] == rhs1.homCoord[0] && homCoord[1] == rhs1.homCoord[1] && homCoord[2] == rhs1.homCoord[2] &&
00335 homCoord[3] == rhs1.homCoord[3] );
00336 }
00337
00338 inline bool HomCoord::operator!=( const HomCoord& rhs1 ) const
00339 {
00340 return ( homCoord[0] != rhs1.homCoord[0] || homCoord[1] != rhs1.homCoord[1] || homCoord[2] != rhs1.homCoord[2] ||
00341 homCoord[3] != rhs1.homCoord[3] );
00342 }
00343
00344 inline bool HomCoord::operator>=( const HomCoord& rhs1 ) const
00345 {
00346 return ( homCoord[0] >= rhs1.homCoord[0] && homCoord[1] >= rhs1.homCoord[1] && homCoord[2] >= rhs1.homCoord[2] &&
00347 homCoord[3] == rhs1.homCoord[3] );
00348 }
00349
00350 inline bool HomCoord::operator<=( const HomCoord& rhs1 ) const
00351 {
00352 return ( homCoord[0] <= rhs1.homCoord[0] && homCoord[1] <= rhs1.homCoord[1] && homCoord[2] <= rhs1.homCoord[2] &&
00353 homCoord[3] == rhs1.homCoord[3] );
00354 }
00355
00356 inline bool HomCoord::operator<( const HomCoord& rhs1 ) const
00357 {
00358 return ( homCoord[0] < rhs1.homCoord[0] && homCoord[1] < rhs1.homCoord[1] && homCoord[2] < rhs1.homCoord[2] &&
00359 homCoord[3] == rhs1.homCoord[3] );
00360 }
00361
00362 inline bool HomCoord::operator>( const HomCoord& rhs1 ) const
00363 {
00364 return ( homCoord[0] > rhs1.homCoord[0] && homCoord[1] > rhs1.homCoord[1] && homCoord[2] > rhs1.homCoord[2] &&
00365 homCoord[3] == rhs1.homCoord[3] );
00366 }
00367
00368 inline HomCoord HomCoord::operator*( const HomXform& rhs2 ) const
00369 {
00370 return HomCoord(
00371 // homCoord[0]*rhs2[4*0+0] + homCoord[1]*rhs2[4*1+0] +
00372 // homCoord[2]*rhs2[4*2+0] + homCoord[3]*rhs2[4*3+0],
00373 homCoord[0] * rhs2.xForm[0] + homCoord[1] * rhs2.xForm[4] + homCoord[2] * rhs2.xForm[8] +
00374 homCoord[3] * rhs2.xForm[12],
00375
00376 // homCoord[0]*rhs2.xForm[4*0+1] + homCoord[1]*rhs2.xForm[4*1+1] +
00377 // homCoord[2]*rhs2.xForm[4*2+1] + homCoord[3]*rhs2.xForm[4*3+1],
00378 homCoord[0] * rhs2.xForm[1] + homCoord[1] * rhs2.xForm[5] + homCoord[2] * rhs2.xForm[9] +
00379 homCoord[3] * rhs2.xForm[13],
00380
00381 // homCoord[0]*rhs2.xForm[4*0+2] + homCoord[1]*rhs2.xForm[4*1+2] +
00382 // homCoord[2]*rhs2.xForm[4*2+2] + homCoord[3]*rhs2.xForm[4*3+2],
00383 homCoord[0] * rhs2.xForm[2] + homCoord[1] * rhs2.xForm[6] + homCoord[2] * rhs2.xForm[10] +
00384 homCoord[3] * rhs2.xForm[14],
00385
00386 // homCoord[0]*rhs2.xForm[4*0+3] + homCoord[1]*rhs2.xForm[4*1+3] +
00387 // homCoord[2]*rhs2.xForm[4*2+3] + homCoord[3]*rhs2.xForm[4*3+3]
00388 homCoord[0] * rhs2.xForm[3] + homCoord[1] * rhs2.xForm[7] + homCoord[2] * rhs2.xForm[11] +
00389 homCoord[3] * rhs2.xForm[15] );
00390 }
00391
00392 inline HomCoord& HomCoord::operator*=( const HomXform& rhs2 )
00393 {
00394 *this = HomCoord(
00395 // homCoord[0]*rhs2.xForm[4*0+0] + homCoord[1]*rhs2.xForm[4*1+0] +
00396 // homCoord[2]*rhs2.xForm[4*2+0] + homCoord[3]*rhs2.xForm[4*3+0],
00397 homCoord[0] * rhs2.xForm[0] + homCoord[1] * rhs2.xForm[4] + homCoord[2] * rhs2.xForm[8] +
00398 homCoord[3] * rhs2.xForm[12],
00399
00400 // homCoord[0]*rhs2.xForm[4*0+1] + homCoord[1]*rhs2.xForm[4*1+1] +
00401 // homCoord[2]*rhs2.xForm[4*2+1] + homCoord[3]*rhs2.xForm[4*3+1],
00402 homCoord[0] * rhs2.xForm[1] + homCoord[1] * rhs2.xForm[5] + homCoord[2] * rhs2.xForm[9] +
00403 homCoord[3] * rhs2.xForm[13],
00404
00405 // homCoord[0]*rhs2.xForm[4*0+2] + homCoord[1]*rhs2.xForm[4*1+2] +
00406 // homCoord[2]*rhs2.xForm[4*2+2] + homCoord[3]*rhs2.xForm[4*3+2],
00407 homCoord[0] * rhs2.xForm[2] + homCoord[1] * rhs2.xForm[6] + homCoord[2] * rhs2.xForm[10] +
00408 homCoord[3] * rhs2.xForm[14],
00409
00410 // homCoord[0]*rhs2.xForm[4*0+3] + homCoord[1]*rhs2.xForm[4*1+3] +
00411 // homCoord[2]*rhs2.xForm[4*2+3] + homCoord[3]*rhs2.xForm[4*3+3]
00412 homCoord[0] * rhs2.xForm[3] + homCoord[1] * rhs2.xForm[7] + homCoord[2] * rhs2.xForm[11] +
00413 homCoord[3] * rhs2.xForm[15] );
00414 return *this;
00415 }
00416
00417 inline HomCoord HomCoord::operator*( const int mult ) const
00418 {
00419 return HomCoord( mult * homCoord[0], mult * homCoord[1], mult * homCoord[2] );
00420 }
00421
00422 inline HomCoord& HomCoord::operator*=( const int mult )
00423 {
00424 homCoord[0] *= mult;
00425 homCoord[1] *= mult;
00426 homCoord[2] *= mult;
00427 return *this;
00428 }
00429
00430 inline HomCoord HomCoord::operator/( const int div ) const
00431 {
00432 return HomCoord( homCoord[0] / div, homCoord[1] / div, homCoord[2] / div );
00433 }
00434
00435 inline HomCoord& HomCoord::operator/=( const int div )
00436 {
00437 homCoord[0] /= div;
00438 homCoord[1] /= div;
00439 homCoord[2] /= div;
00440 return *this;
00441 }
00442
00443 inline HomCoord HomCoord::operator-( const HomCoord& rhs2 ) const
00444 {
00445 return HomCoord( *this ) -= rhs2;
00446 }
00447
00448 inline HomCoord& HomCoord::operator-=( const HomCoord& rhs2 )
00449 {
00450 homCoord[0] -= rhs2[0];
00451 homCoord[1] -= rhs2[1];
00452 homCoord[2] -= rhs2[2];
00453 return *this;
00454 }
00455
00456 inline HomCoord HomCoord::operator+( const HomCoord& rhs2 ) const
00457 {
00458 return HomCoord( *this ) += rhs2;
00459 }
00460
00461 inline HomCoord& HomCoord::operator+=( const HomCoord& rhs2 )
00462 {
00463 homCoord[0] += rhs2[0];
00464 homCoord[1] += rhs2[1];
00465 homCoord[2] += rhs2[2];
00466 return *this;
00467 }
00468
00469 inline HomCoord HomCoord::operator/( const HomXform& rhs2 ) const
00470 {
00471 return HomCoord( *this ) /= rhs2;
00472 }
00473
00474 inline HomCoord& HomCoord::operator/=( const HomXform& rhs2 )
00475 {
00476 HomXform inv = rhs2.inverse();
00477 *this *= inv;
00478 return *this;
00479 }
00480
00481 inline int HomCoord::operator[]( const int& param ) const
00482 {
00483 return homCoord[param];
00484 }
00485
00486 inline int& HomCoord::operator[]( const int& param )
00487 {
00488 return homCoord[param];
00489 }
00490
00491 inline std::ostream& operator<<( std::ostream& str, const HomCoord& hc )
00492 {
00493 str << "(" << hc.i() << "," << hc.j() << "," << hc.k() << ")";
00494 return str;
00495 }
00496
00497 inline HomXform::HomXform( const int matrix[16] )
00498 {
00499 for( int i = 0; i < 16; i++ )
00500 xForm[i] = matrix[i];
00501 }
00502
00503 inline HomXform::HomXform() {}
00504
00505 inline HomXform::HomXform( const int rotate[9], const int scale[3], const int translate[3] )
00506 {
00507 int i, j;
00508 for( i = 0; i < 3; i++ )
00509 {
00510 for( j = 0; j < 3; j++ )
00511 xForm[i * 4 + j] = rotate[i * 3 + j] * scale[j];
00512
00513 xForm[12 + i] = translate[i];
00514 }
00515 xForm[3] = 0;
00516 xForm[7] = 0;
00517 xForm[11] = 0;
00518 xForm[15] = 1;
00519 }
00520
00521 inline HomXform::HomXform( int i1,
00522 int i2,
00523 int i3,
00524 int i4,
00525 int i5,
00526 int i6,
00527 int i7,
00528 int i8,
00529 int i9,
00530 int i10,
00531 int i11,
00532 int i12,
00533 int i13,
00534 int i14,
00535 int i15,
00536 int i16 )
00537 {
00538 xForm[0] = i1;
00539 xForm[1] = i2;
00540 xForm[2] = i3;
00541 xForm[3] = i4;
00542 xForm[4] = i5;
00543 xForm[5] = i6;
00544 xForm[6] = i7;
00545 xForm[7] = i8;
00546 xForm[8] = i9;
00547 xForm[9] = i10;
00548 xForm[10] = i11;
00549 xForm[11] = i12;
00550 xForm[12] = i13;
00551 xForm[13] = i14;
00552 xForm[14] = i15;
00553 xForm[15] = i16;
00554 }
00555
00556 inline HomXform& HomXform::operator=( const HomXform& rhs )
00557 {
00558 for( int i = 0; i < 16; i++ )
00559 xForm[i] = rhs.xForm[i];
00560
00561 return *this;
00562 }
00563
00564 inline HomXform HomXform::operator*( const HomXform& rhs2 ) const
00565 {
00566 return HomXform(
00567 // temp.XFORM(0,0)
00568 XFORM( 0, 0 ) * rhs2.XFORM( 0, 0 ) + XFORM( 0, 1 ) * rhs2.XFORM( 1, 0 ) + XFORM( 0, 2 ) * rhs2.XFORM( 2, 0 ) +
00569 XFORM( 0, 3 ) * rhs2.XFORM( 3, 0 ),
00570 // temp.XFORM(0,1)
00571 XFORM( 0, 0 ) * rhs2.XFORM( 0, 1 ) + XFORM( 0, 1 ) * rhs2.XFORM( 1, 1 ) + XFORM( 0, 2 ) * rhs2.XFORM( 2, 1 ) +
00572 XFORM( 0, 3 ) * rhs2.XFORM( 3, 1 ),
00573 // temp.XFORM(0,2)
00574 XFORM( 0, 0 ) * rhs2.XFORM( 0, 2 ) + XFORM( 0, 1 ) * rhs2.XFORM( 1, 2 ) + XFORM( 0, 2 ) * rhs2.XFORM( 2, 2 ) +
00575 XFORM( 0, 3 ) * rhs2.XFORM( 3, 2 ),
00576 // temp.XFORM(0,3)
00577 XFORM( 0, 0 ) * rhs2.XFORM( 0, 3 ) + XFORM( 0, 1 ) * rhs2.XFORM( 1, 3 ) + XFORM( 0, 2 ) * rhs2.XFORM( 2, 3 ) +
00578 XFORM( 0, 3 ) * rhs2.XFORM( 3, 3 ),
00579
00580 // temp.XFORM(1,0)
00581 XFORM( 1, 0 ) * rhs2.XFORM( 0, 0 ) + XFORM( 1, 1 ) * rhs2.XFORM( 1, 0 ) + XFORM( 1, 2 ) * rhs2.XFORM( 2, 0 ) +
00582 XFORM( 1, 3 ) * rhs2.XFORM( 3, 0 ),
00583 // temp.XFORM(1,1)
00584 XFORM( 1, 0 ) * rhs2.XFORM( 0, 1 ) + XFORM( 1, 1 ) * rhs2.XFORM( 1, 1 ) + XFORM( 1, 2 ) * rhs2.XFORM( 2, 1 ) +
00585 XFORM( 1, 3 ) * rhs2.XFORM( 3, 1 ),
00586 // temp.XFORM(1,2)
00587 XFORM( 1, 0 ) * rhs2.XFORM( 0, 2 ) + XFORM( 1, 1 ) * rhs2.XFORM( 1, 2 ) + XFORM( 1, 2 ) * rhs2.XFORM( 2, 2 ) +
00588 XFORM( 1, 3 ) * rhs2.XFORM( 3, 2 ),
00589 // temp.XFORM(1,3)
00590 XFORM( 1, 0 ) * rhs2.XFORM( 0, 3 ) + XFORM( 1, 1 ) * rhs2.XFORM( 1, 3 ) + XFORM( 1, 2 ) * rhs2.XFORM( 2, 3 ) +
00591 XFORM( 1, 3 ) * rhs2.XFORM( 3, 3 ),
00592
00593 // temp.XFORM(2,0)
00594 XFORM( 2, 0 ) * rhs2.XFORM( 0, 0 ) + XFORM( 2, 1 ) * rhs2.XFORM( 1, 0 ) + XFORM( 2, 2 ) * rhs2.XFORM( 2, 0 ) +
00595 XFORM( 2, 3 ) * rhs2.XFORM( 3, 0 ),
00596 // temp.XFORM(2,1)
00597 XFORM( 2, 0 ) * rhs2.XFORM( 0, 1 ) + XFORM( 2, 1 ) * rhs2.XFORM( 1, 1 ) + XFORM( 2, 2 ) * rhs2.XFORM( 2, 1 ) +
00598 XFORM( 2, 3 ) * rhs2.XFORM( 3, 1 ),
00599 // temp.XFORM(2,2)
00600 XFORM( 2, 0 ) * rhs2.XFORM( 0, 2 ) + XFORM( 2, 1 ) * rhs2.XFORM( 1, 2 ) + XFORM( 2, 2 ) * rhs2.XFORM( 2, 2 ) +
00601 XFORM( 2, 3 ) * rhs2.XFORM( 3, 2 ),
00602 // temp.XFORM(2,3)
00603 XFORM( 2, 0 ) * rhs2.XFORM( 0, 3 ) + XFORM( 2, 1 ) * rhs2.XFORM( 1, 3 ) + XFORM( 2, 2 ) * rhs2.XFORM( 2, 3 ) +
00604 XFORM( 2, 3 ) * rhs2.XFORM( 3, 3 ),
00605
00606 // temp.XFORM(3,0)
00607 // xForm[12]*rhs2.xForm[0] + xForm[13]*rhs2.xForm[4] + xForm[14]*rhs2.xForm[8] +
00608 // xForm[15]*rhs2.xForm[12]
00609 XFORM( 3, 0 ) * rhs2.XFORM( 0, 0 ) + XFORM( 3, 1 ) * rhs2.XFORM( 1, 0 ) + XFORM( 3, 2 ) * rhs2.XFORM( 2, 0 ) +
00610 XFORM( 3, 3 ) * rhs2.XFORM( 3, 0 ),
00611 // temp.XFORM(3,1)
00612 // xForm[12]*rhs2.xForm[1] + xForm[13]*rhs2.xForm[5] + xForm[14]*rhs2.xForm[9] +
00613 // xForm[15]*rhs2.xForm[13]
00614 XFORM( 3, 0 ) * rhs2.XFORM( 0, 1 ) + XFORM( 3, 1 ) * rhs2.XFORM( 1, 1 ) + XFORM( 3, 2 ) * rhs2.XFORM( 2, 1 ) +
00615 XFORM( 3, 3 ) * rhs2.XFORM( 3, 1 ),
00616 // temp.XFORM(3,2)
00617 // xForm[12]*rhs2.xForm[2] + xForm[13]*rhs2.xForm[6] + xForm[14]*rhs2.xForm[10] +
00618 // xForm[15]*rhs2.xForm[14]
00619 XFORM( 3, 0 ) * rhs2.XFORM( 0, 2 ) + XFORM( 3, 1 ) * rhs2.XFORM( 1, 2 ) + XFORM( 3, 2 ) * rhs2.XFORM( 2, 2 ) +
00620 XFORM( 3, 3 ) * rhs2.XFORM( 3, 2 ),
00621 // temp.XFORM(3,3)
00622 // xForm[12]*rhs2.xForm[3] + xForm[13]*rhs2.xForm[7] + xForm[14]*rhs2.xForm[11] +
00623 // xForm[15]*rhs2.xForm[15]
00624 XFORM( 3, 0 ) * rhs2.XFORM( 0, 3 ) + XFORM( 3, 1 ) * rhs2.XFORM( 1, 3 ) + XFORM( 3, 2 ) * rhs2.XFORM( 2, 3 ) +
00625 XFORM( 3, 3 ) * rhs2.XFORM( 3, 3 ) );
00626 }
00627
00628 inline HomXform& HomXform::operator*=( const HomXform& rhs2 )
00629 {
00630 *this = HomXform(
00631 // temp.XFORM(0,0)
00632 XFORM( 0, 0 ) * rhs2.XFORM( 0, 0 ) + XFORM( 0, 1 ) * rhs2.XFORM( 1, 0 ) + XFORM( 0, 2 ) * rhs2.XFORM( 2, 0 ) +
00633 XFORM( 0, 3 ) * rhs2.XFORM( 3, 0 ),
00634 // temp.XFORM(0,1)
00635 XFORM( 0, 0 ) * rhs2.XFORM( 0, 1 ) + XFORM( 0, 1 ) * rhs2.XFORM( 1, 1 ) + XFORM( 0, 2 ) * rhs2.XFORM( 2, 1 ) +
00636 XFORM( 0, 3 ) * rhs2.XFORM( 3, 1 ),
00637 // temp.XFORM(0,2)
00638 XFORM( 0, 0 ) * rhs2.XFORM( 0, 2 ) + XFORM( 0, 1 ) * rhs2.XFORM( 1, 2 ) + XFORM( 0, 2 ) * rhs2.XFORM( 2, 2 ) +
00639 XFORM( 0, 3 ) * rhs2.XFORM( 3, 2 ),
00640 // temp.XFORM(0,3)
00641 XFORM( 0, 0 ) * rhs2.XFORM( 0, 3 ) + XFORM( 0, 1 ) * rhs2.XFORM( 1, 3 ) + XFORM( 0, 2 ) * rhs2.XFORM( 2, 3 ) +
00642 XFORM( 0, 3 ) * rhs2.XFORM( 3, 3 ),
00643
00644 // temp.XFORM(1,0)
00645 XFORM( 1, 0 ) * rhs2.XFORM( 0, 0 ) + XFORM( 1, 1 ) * rhs2.XFORM( 1, 0 ) + XFORM( 1, 2 ) * rhs2.XFORM( 2, 0 ) +
00646 XFORM( 1, 3 ) * rhs2.XFORM( 3, 0 ),
00647 // temp.XFORM(1,1)
00648 XFORM( 1, 0 ) * rhs2.XFORM( 0, 1 ) + XFORM( 1, 1 ) * rhs2.XFORM( 1, 1 ) + XFORM( 1, 2 ) * rhs2.XFORM( 2, 1 ) +
00649 XFORM( 1, 3 ) * rhs2.XFORM( 3, 1 ),
00650 // temp.XFORM(1,2)
00651 XFORM( 1, 0 ) * rhs2.XFORM( 0, 2 ) + XFORM( 1, 1 ) * rhs2.XFORM( 1, 2 ) + XFORM( 1, 2 ) * rhs2.XFORM( 2, 2 ) +
00652 XFORM( 1, 3 ) * rhs2.XFORM( 3, 2 ),
00653 // temp.XFORM(1,3)
00654 XFORM( 1, 0 ) * rhs2.XFORM( 0, 3 ) + XFORM( 1, 1 ) * rhs2.XFORM( 1, 3 ) + XFORM( 1, 2 ) * rhs2.XFORM( 2, 3 ) +
00655 XFORM( 1, 3 ) * rhs2.XFORM( 3, 3 ),
00656
00657 // temp.XFORM(2,0)
00658 XFORM( 2, 0 ) * rhs2.XFORM( 0, 0 ) + XFORM( 2, 1 ) * rhs2.XFORM( 1, 0 ) + XFORM( 2, 2 ) * rhs2.XFORM( 2, 0 ) +
00659 XFORM( 2, 3 ) * rhs2.XFORM( 3, 0 ),
00660 // temp.XFORM(2,1)
00661 XFORM( 2, 0 ) * rhs2.XFORM( 0, 1 ) + XFORM( 2, 1 ) * rhs2.XFORM( 1, 1 ) + XFORM( 2, 2 ) * rhs2.XFORM( 2, 1 ) +
00662 XFORM( 2, 3 ) * rhs2.XFORM( 3, 1 ),
00663 // temp.XFORM(2,2)
00664 XFORM( 2, 0 ) * rhs2.XFORM( 0, 2 ) + XFORM( 2, 1 ) * rhs2.XFORM( 1, 2 ) + XFORM( 2, 2 ) * rhs2.XFORM( 2, 2 ) +
00665 XFORM( 2, 3 ) * rhs2.XFORM( 3, 2 ),
00666 // temp.XFORM(2,3)
00667 XFORM( 2, 0 ) * rhs2.XFORM( 0, 3 ) + XFORM( 2, 1 ) * rhs2.XFORM( 1, 3 ) + XFORM( 2, 2 ) * rhs2.XFORM( 2, 3 ) +
00668 XFORM( 2, 3 ) * rhs2.XFORM( 3, 3 ),
00669
00670 // temp.XFORM(3,0)
00671 XFORM( 3, 0 ) * rhs2.XFORM( 0, 0 ) + XFORM( 3, 1 ) * rhs2.XFORM( 1, 0 ) + XFORM( 3, 2 ) * rhs2.XFORM( 2, 0 ) +
00672 XFORM( 3, 3 ) * rhs2.XFORM( 3, 0 ),
00673 // temp.XFORM(3,1)
00674 XFORM( 3, 0 ) * rhs2.XFORM( 0, 1 ) + XFORM( 3, 1 ) * rhs2.XFORM( 1, 1 ) + XFORM( 3, 2 ) * rhs2.XFORM( 2, 1 ) +
00675 XFORM( 3, 3 ) * rhs2.XFORM( 3, 1 ),
00676 // temp.XFORM(3,2)
00677 XFORM( 3, 0 ) * rhs2.XFORM( 0, 2 ) + XFORM( 3, 1 ) * rhs2.XFORM( 1, 2 ) + XFORM( 3, 2 ) * rhs2.XFORM( 2, 2 ) +
00678 XFORM( 3, 3 ) * rhs2.XFORM( 3, 2 ),
00679 // temp.XFORM(3,3)
00680 XFORM( 3, 0 ) * rhs2.XFORM( 0, 3 ) + XFORM( 3, 1 ) * rhs2.XFORM( 1, 3 ) + XFORM( 3, 2 ) * rhs2.XFORM( 2, 3 ) +
00681 XFORM( 3, 3 ) * rhs2.XFORM( 3, 3 ) );
00682
00683 return *this;
00684 }
00685
00686 inline int HomXform::operator[]( const int& count ) const
00687 {
00688 return xForm[count];
00689 }
00690
00691 inline int& HomXform::operator[]( const int& count )
00692 {
00693 return xForm[count];
00694 }
00695
00696 inline bool HomXform::operator==( const HomXform& rhs ) const
00697 {
00698 return ( xForm[0] == rhs.xForm[0] && xForm[1] == rhs.xForm[1] && xForm[2] == rhs.xForm[2] &&
00699 xForm[3] == rhs.xForm[3] && xForm[4] == rhs.xForm[4] && xForm[5] == rhs.xForm[5] &&
00700 xForm[6] == rhs.xForm[6] && xForm[7] == rhs.xForm[7] && xForm[8] == rhs.xForm[8] &&
00701 xForm[9] == rhs.xForm[9] && xForm[10] == rhs.xForm[10] && xForm[11] == rhs.xForm[11] &&
00702 xForm[12] == rhs.xForm[12] && xForm[13] == rhs.xForm[13] && xForm[14] == rhs.xForm[14] &&
00703 xForm[15] == rhs.xForm[15] );
00704 }
00705
00706 inline bool HomXform::operator!=( const HomXform& rhs ) const
00707 {
00708 return ( xForm[0] != rhs.xForm[0] || xForm[1] != rhs.xForm[1] || xForm[2] != rhs.xForm[2] ||
00709 xForm[3] != rhs.xForm[3] || xForm[4] != rhs.xForm[4] || xForm[5] != rhs.xForm[5] ||
00710 xForm[6] != rhs.xForm[6] || xForm[7] != rhs.xForm[7] || xForm[8] != rhs.xForm[8] ||
00711 xForm[9] != rhs.xForm[9] || xForm[10] != rhs.xForm[10] || xForm[11] != rhs.xForm[11] ||
00712 xForm[12] != rhs.xForm[12] || xForm[13] != rhs.xForm[13] || xForm[14] != rhs.xForm[14] ||
00713 xForm[15] != rhs.xForm[15] );
00714 }
00715
00716 inline HomXform HomXform::inverse() const
00717 {
00718
00719 /*
00720 // original code:
00721
00722 HomXform tmp;
00723
00724 // assign the diagonal
00725 tmp[0] = xForm[0];
00726 tmp[5] = xForm[5];
00727 tmp[10] = xForm[10];
00728 tmp[15] = xForm[15];
00729
00730 // invert the rotation matrix
00731 tmp[XFORM_INDEX(0,1)] = XFORM(1,0);
00732 tmp[XFORM_INDEX(0,2)] = XFORM(2,0);
00733 tmp[XFORM_INDEX(1,0)] = XFORM(0,1);
00734 tmp[XFORM_INDEX(1,2)] = XFORM(2,1);
00735 tmp[XFORM_INDEX(2,0)] = XFORM(0,2);
00736 tmp[XFORM_INDEX(2,1)] = XFORM(1,2);
00737
00738 // negative translate * Rinv
00739 tmp[XFORM_INDEX(3,0)] = -(XFORM(3,0)*tmp.XFORM(0,0) + XFORM(3,1)*tmp.XFORM(1,0) +
00740 XFORM(3,2)*tmp.XFORM(2,0)); tmp[XFORM_INDEX(3,1)] = -(XFORM(3,0)*tmp.XFORM(0,1) +
00741 XFORM(3,1)*tmp.XFORM(1,1) + XFORM(3,2)*tmp.XFORM(2,1)); tmp[XFORM_INDEX(3,2)] =
00742 -(XFORM(3,0)*tmp.XFORM(0,2) + XFORM(3,1)*tmp.XFORM(1,2) + XFORM(3,2)*tmp.XFORM(2,2));
00743
00744 // zero last column
00745 tmp[XFORM_INDEX(0,3)] = 0;
00746 tmp[XFORM_INDEX(1,3)] = 0;
00747 tmp[XFORM_INDEX(2,3)] = 0;
00748
00749 // h factor
00750 tmp[XFORM_INDEX(3,3)] = 1;
00751
00752 return tmp;
00753 */
00754
00755 // more efficient, but somewhat confusing (remember, column-major):
00756
00757 return HomXform(
00758 // row 0
00759 xForm[0], XFORM( 1, 0 ), XFORM( 2, 0 ), 0,
00760 // row 1
00761 XFORM( 0, 1 ), xForm[5], XFORM( 2, 1 ), 0,
00762 // row 2
00763 XFORM( 0, 2 ), XFORM( 1, 2 ), xForm[10], 0,
00764 // row 3
00765 -( XFORM( 3, 0 ) * xForm[0] + XFORM( 3, 1 ) * XFORM( 0, 1 ) + XFORM( 3, 2 ) * XFORM( 0, 2 ) ),
00766 -( XFORM( 3, 0 ) * XFORM( 1, 0 ) + XFORM( 3, 1 ) * xForm[5] + XFORM( 3, 2 ) * XFORM( 1, 2 ) ),
00767 -( XFORM( 3, 0 ) * XFORM( 2, 0 ) + XFORM( 3, 1 ) * XFORM( 2, 1 ) + XFORM( 3, 2 ) * xForm[10] ), 1 );
00768 }
00769
00770 } // namespace moab
00771
00772 #endif