transformation.hpp
Go to the documentation of this file.
00001 00005 /* Copyright (c) 2010-2011 Taneli Kalvas. All rights reserved. 00006 * 00007 * You can redistribute this software and/or modify it under the terms 00008 * of the GNU General Public License as published by the Free Software 00009 * Foundation; either version 2 of the License, or (at your option) 00010 * any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, but 00013 * WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with this library (file "COPYING" included in the package); 00019 * if not, write to the Free Software Foundation, Inc., 51 Franklin 00020 * Street, Fifth Floor, Boston, MA 02110-1301 USA 00021 * 00022 * If you have questions about your rights to use or distribute this 00023 * software, please contact Berkeley Lab's Technology Transfer 00024 * Department at TTD@lbl.gov. Other questions, comments and bug 00025 * reports should be sent directly to the author via email at 00026 * taneli.kalvas@jyu.fi. 00027 * 00028 * NOTICE. This software was developed under partial funding from the 00029 * U.S. Department of Energy. As such, the U.S. Government has been 00030 * granted for itself and others acting on its behalf a paid-up, 00031 * nonexclusive, irrevocable, worldwide license in the Software to 00032 * reproduce, prepare derivative works, and perform publicly and 00033 * display publicly. Beginning five (5) years after the date 00034 * permission to assert copyright is obtained from the U.S. Department 00035 * of Energy, and subject to any subsequent five (5) year renewals, 00036 * the U.S. Government is granted for itself and others acting on its 00037 * behalf a paid-up, nonexclusive, irrevocable, worldwide license in 00038 * the Software to reproduce, prepare derivative works, distribute 00039 * copies to the public, perform publicly and display publicly, and to 00040 * permit others to do so. 00041 */ 00042 00043 #ifndef TRANSFORMATION_HPP 00044 #define TRANSFORMATION_HPP 1 00045 00046 00047 #include <string.h> 00048 #include "vec3d.hpp" 00049 #include "vec4d.hpp" 00050 00051 00059 class Transformation 00060 { 00061 00062 double x[16]; /* Matrix data in row first order: 00063 * 0 1 2 3 00064 * 4 5 6 7 00065 * 8 9 10 11 00066 * 12 13 14 15 00067 */ 00068 00069 public: 00070 00073 Transformation(); 00074 00077 Transformation( double x11, double x12, double x13, double x14, 00078 double x21, double x22, double x23, double x24, 00079 double x31, double x32, double x33, double x34, 00080 double x41, double x42, double x43, double x44 ); 00081 00084 Transformation( const Transformation &m ); 00085 00088 Transformation( std::istream &is ); 00089 00092 ~Transformation(); 00093 00094 00095 00096 00097 00100 double &operator[]( int i ) { 00101 return( x[i] ); 00102 } 00103 00106 const double &operator[]( int i ) const { 00107 return( x[i] ); 00108 } 00109 00112 double determinant( void ) const; 00113 00116 Transformation inverse( void ) const; 00117 00120 const Transformation &operator*=( double s ); 00121 00130 Transformation operator*( const Transformation &m ) const; 00131 00136 Vec4D operator*( const Vec4D &v ) const; 00137 00143 Vec4D operator%( const Vec4D &v ) const; 00144 00145 00146 00147 00148 00151 Vec4D transform( const Vec4D &xin ) const; 00152 00153 00154 00155 00161 Vec3D transform_point( const Vec3D &xin ) const; 00162 00172 Vec3D inv_transform_point( const Vec3D &xin ) const; 00173 00174 00175 00176 00182 Vec3D transform_vector( const Vec3D &xin ) const; 00183 00193 Vec3D inv_transform_vector( const Vec3D &xin ) const; 00194 00195 00196 00197 00202 void reset( void ); 00203 00209 void translate( const Vec3D &d ); 00210 00216 void scale( const Vec3D &s ); 00217 00225 void rotate_x( double a ); 00226 00234 void rotate_y( double a ); 00235 00243 void rotate_z( double a ); 00244 00247 static Transformation unity( void ); 00248 00251 static Transformation translation( const Vec3D &d ); 00252 00255 static Transformation scaling( const Vec3D &s ); 00256 00259 static Transformation rotation_x( double a ); 00260 00263 static Transformation rotation_y( double a ); 00264 00267 static Transformation rotation_z( double a ); 00268 00271 friend std::ostream &operator<<( std::ostream &os, const Transformation &t ); 00272 00275 void save( const std::string &filename ) const; 00276 00279 void save( std::ostream &os ) const; 00280 00283 void debug_print( std::ostream &os ) const; 00284 }; 00285 00286 00287 00288 00289 #endif 00290