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 
00291