include/Integrator.h

00001 
00026 #ifndef _INTEGRATOR_
00027 #define _INTEGRATOR_
00028 
00029 #include <Level2D.h>
00030 #include <Vector2D.h>
00031 #include <irrlicht.h>
00032 #include <stdlib.h>
00033 #include <string.h>
00034 #include <ctype.h>
00035 #include <limits>
00036 #include <disableWarnings.h>
00037 
00038 namespace sonus
00039 {
00040         using namespace::irr;
00041 
00057         class Integrator
00058         {
00059                 public:
00060 
00074                         static void getTransformAndScaleFactor( Level2D* level, Vector2D* destinationOrigin, double maxValue, 
00075                                                                                                         Vector2D* transformationVector, double* scaleFactor )
00076                         {
00077                                 Body2D<Vector2D>* border = level->worldVector2D->getBorder();
00078 
00079                                 Vector2D minVector;
00080                                 minVector.setTo( DBL_MAX, DBL_MAX );
00081                                 Vector2D maxVector;
00082                                 maxVector.setTo( DBL_MIN, DBL_MIN );
00083                                 Vector2D tempVector;
00084 
00085                                 for ( int i = 1; i < border->getSize(); i++ )
00086                                 {
00087                                         tempVector = *border->getElementAt( i );
00088                                         if ( tempVector.x < minVector.x )
00089                                         {
00090                                                 minVector.x = tempVector.x;
00091                                         }
00092                                         if ( tempVector.y < minVector.y )
00093                                         {
00094                                                 minVector.y = tempVector.y;
00095                                         }
00096                                         if ( tempVector.x > maxVector.x )
00097                                         {
00098                                                 maxVector.x = tempVector.x;
00099                                         }
00100                                         if ( tempVector.y > maxVector.y )
00101                                         {
00102                                                 maxVector.y = tempVector.y;
00103                                         }
00104                                 }
00105 
00106                                 double dX = maxVector.x - minVector.x;
00107                                 double dY = maxVector.y - minVector.y;
00108                                 *scaleFactor = maxValue / ( dX > dY ? dX : dY );
00109 
00110                                 *transformationVector = ( *destinationOrigin / *scaleFactor  ) 
00111                                         - minVector + 0.5 * ( maxVector - minVector );
00112                         }
00113 
00122                         static void transform( Vector2D* value, Vector2D* transformationVector, double scaleFactor )
00123                         {
00124                                 *value -= *transformationVector;
00125                                 *value *= scaleFactor;
00126                         }
00127 
00136                         static void reTransform( Vector2D* value, Vector2D* transformationVector, double scaleFactor )
00137                         {
00138                                 *value /= scaleFactor;
00139                                 *value += *transformationVector;
00140                         }
00141 
00151                         static Vector2D* transformInvertY( Vector2D* value, Vector2D* transformationVector, double scaleFactor )
00152                         {
00153                                 Vector2D* temp = new Vector2D();
00154                                 *temp = *value;
00155                                 *temp -= *transformationVector;
00156                                 *temp *= scaleFactor;
00157                                 temp->y *= -1;
00158 
00159                                 return temp; 
00160                         }
00161 
00171                         static Vector2D* reTransformInvertY( Vector2D* value, Vector2D* transformationVector, double scaleFactor )
00172                         {
00173                                 Vector2D* temp = new Vector2D();
00174                                 *temp = *value;
00175 
00176                                 *temp /= scaleFactor;
00177                                 *temp += *transformationVector;
00178                                 temp->y *= -1;
00179 
00180                                 return temp; 
00181                         }
00182 
00192                         static Vector2D* transformInvertX( Vector2D* value, Vector2D* transformationVector, double scaleFactor )
00193                         {
00194                                 Vector2D* temp = new Vector2D();
00195                                 *temp = *value;
00196                                 *temp -= *transformationVector;
00197                                 *temp *= scaleFactor;
00198                                 temp->x *= -1;
00199 
00200                                 return temp;  
00201                         }
00202 
00212                         static Vector2D* reTransformInvertX( Vector2D* value, Vector2D* transformationVector, double scaleFactor )
00213                         {
00214                                 Vector2D* temp = new Vector2D();
00215                                 *temp = *value;
00216 
00217                                 *temp /= scaleFactor;
00218                                 *temp += *transformationVector;
00219                                 temp->x *= -1;
00220 
00221                                 return temp;  
00222                         }
00223 
00230                         static double getAngleFromUnifiedVector( Vector2D v )
00231                         {
00232                                 if ( v.y == 0 )
00233                                 {
00234                                         v.y = 0.0000001;
00235                                 }
00236                                 return ( atan( v.x / v.y ) * core::RADTODEG ) + ( v.y < 0 ? +180 : 0 );
00237                         }
00238 
00246                         static double getAngleFromVector( Vector2D v )
00247                         {
00248                                 v.unify();
00249                                 return getAngleFromUnifiedVector( v );
00250                         }
00251 
00260                         static double getFixedAngleFromVector( Vector2D v, double threshold )
00261                         {
00262                                 double angle = getAngleFromVector( v );
00263                                 int factor = 1.0f/threshold * 10;
00264                                 int tempRes = angle * factor;
00265                                 tempRes = tempRes % 10;
00266                                 double result = double(tempRes) / double(factor);
00267                                 return angle - result;
00268                         }
00269         };
00270 }
00271 
00272 #endif

Generated on Tue Aug 26 12:26:54 2008 for sonus by  doxygen 1.5.4