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