Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | Related Pages

glmath.h

00001 /*
00002 Copyright (c) 2000-2003 Lee Thomason (www.grinninglizard.com)
00003 Grinning Lizard Utilities.
00004 
00005 This software is provided 'as-is', without any express or implied 
00006 warranty. In no event will the authors be held liable for any 
00007 damages arising from the use of this software.
00008 
00009 Permission is granted to anyone to use this software for any 
00010 purpose, including commercial applications, and to alter it and 
00011 redistribute it freely, subject to the following restrictions:
00012 
00013 1. The origin of this software must not be misrepresented; you must 
00014 not claim that you wrote the original software. If you use this 
00015 software in a product, an acknowledgment in the product documentation 
00016 would be appreciated but is not required.
00017 
00018 2. Altered source versions must be plainly marked as such, and 
00019 must not be misrepresented as being the original software.
00020 
00021 3. This notice may not be removed or altered from any source 
00022 distribution.
00023 */
00024 
00025 
00026 #ifndef GRINLIZ_MATH_INCLUDED
00027 #define GRINLIZ_MATH_INCLUDED
00028 
00029 #include <math.h>
00030 #include "glutil.h"
00031 
00032 namespace grinliz
00033 {
00034 const float  PI = 3.1415926535897932384626433832795f;
00035 const double PI_D = 3.1415926535897932384626433832795;
00036 
00037 const float RAD_TO_DEG = (float)( 360.0 / ( 2.0 * PI ) );
00038 const float DEG_TO_RAD = (float)( ( 2.0 * PI ) / 360.0 );
00039 const float SQRT2 = 1.4142135623730950488016887242097f;
00040 const float SQRT2OVER2 = float( 1.4142135623730950488016887242097 / 2.0 );
00041 
00042 const float EPSILON = 0.000001f;
00043 
00045 inline bool Equal( float x, float y, float epsilon )
00046 {
00047         return fabs( (double)(x - y) ) <= (double)epsilon;
00048 }
00049 inline bool Equal( double x, double y, double epsilon )
00050 {
00051         return fabs( x - y ) <= epsilon;
00052 }
00053 
00060 void DegDelta( float angle0, float angle1, float* distance, float* bias );
00061 
00063 inline float Length( float x, float y )
00064 {
00065         // It's worth some time here:
00066         //              http://www.azillionmonkeys.com/qed/sqroot.html
00067         // to make this (perhaps) better. 
00068 
00069         // Use the much faster "f" version.
00070         return sqrtf( x*x + y*y );
00071 }
00072 
00073 inline double Length( double x, double y ) 
00074 { 
00075         // The more accurate double version.
00076         return sqrt( x*x + y*y ); 
00077 }
00078 
00080 inline float Length( float x, float y, float z )
00081 {
00082         return sqrtf( x*x + y*y + z*z );
00083 }
00084 
00085 inline double Length( double x, double y, double z ) 
00086 { 
00087         return sqrt( x*x + y*y + z*z ); 
00088 }
00089 
00091 inline float Length( float x, float y, float z, float w )
00092 {
00093         return sqrtf( x*x + y*y + z*z + w*w );
00094 }
00095 
00096 
00098 template <class T> inline T FastLength( T x, T y, T z )
00099 {
00100         float a = (float) fabs( x );
00101         float b = (float) fabs( y );
00102         float c = (float) fabs( z );
00103 
00104         if ( b > a ) Swap( &b, &a );
00105         if ( c > a ) Swap( &c, &a );
00106 
00107         // a, b, and c are now meaningless, but
00108         // a is the max.
00109 
00110         float ret = a + ( b + c ) / 4;
00111         return ret;
00112 }
00113 
00114 
00116 template <class T> inline T FastLength( T x, T y )
00117 {
00118         float a = (float) fabs( x );
00119         float b = (float) fabs( y );
00120 
00121         if ( b > a ) grinliz::Swap( &b, &a );
00122 
00123         // a and b are now meaningless, but
00124         // a is the max.
00125 
00126         float ret = a + b / 4;
00127         return ret;
00128 }
00129 
00131 template <class T> inline T Average( T y0, T y1 )
00132 {
00133         return ( y0 + y1 ) / T( 2 );
00134 }
00135 
00136 
00137 
00138 };      // namespace grinliz
00139 
00140 #endif

Generated on Sun Sep 25 16:25:49 2005 for Kyra by  doxygen 1.4.3