SourceForge.jp

dkutilMathEx.h

説明を見る。
00001 #ifndef _dkutilMathEx__
00002 #define _dkutilMathEx__
00003 
00004 namespace dkutil{
00005 #ifdef USE_DKINGYO_SINTABLESIZE_256
00006 #   define DKINGYO_SINTABLESIZE 256
00007 #else
00008 #   define DKINGYO_SINTABLESIZE 360
00009 #endif
00010 #define DKINGYO_SINTABLEMASK        255//(DKINGYO_SINTABLESIZE - 1)
00011 
00012 #define DKINGYO_DTOR    0.0174532925199432957692369077
00013 
00014 #define DKINGYO_RTOD    57.295779513082320876798154814
00015 
00016 //#define DKINGYO_DTOR_FLOAT 0.01745329f
00017 //#define DKINGYO_RTOD_FLOAT 57.2957795f
00018 
00034 class TrigonometricFunction{
00035 protected:
00036     static float    sintable[DKINGYO_SINTABLESIZE];
00037 
00038 public:
00039     TrigonometricFunction(){
00040         static bool re=triginit();
00041     }
00042     virtual ~TrigonometricFunction()
00043     {}
00044 #ifdef USE_DKINGYO_SINTABLESIZE_256
00045     bool triginit(void)
00046     {
00047             double  theta;
00048             for (int i = 0; i < DKINGYO_SINTABLESIZE; ++i)
00049             {
00050                     theta = (double)i/((float)DKINGYO_SINTABLESIZE / (2.0f * getPAI()));
00051                     sintable[i] = (float)sin(theta);
00052             }
00053             return true;
00054     }
00056     inline float    fsin(float theta)
00057     {
00058         int angle = get360to256(RadianToDegree(theta));
00059         return sintable[angle & DKINGYO_SINTABLEMASK];
00060     
00061     }
00063     inline float    fcos(float theta)
00064     {
00065         int angle = get360to256(RadianToDegree(theta));
00066         return sintable[(angle+(DKINGYO_SINTABLESIZE>>2)) & DKINGYO_SINTABLEMASK];
00067     }
00072     inline float AngleToCos( int angle ){
00073         //angle = get360to256(angle);
00074         //int a=(angle+(SINTABLESIZE>>2)) & SINTABLEMASK;
00075         //if(a>254) MB("ERROR");
00076         return sintable[(get360to256(angle)+(DKINGYO_SINTABLESIZE>>2)) & DKINGYO_SINTABLEMASK];
00077     }
00079     inline float AngleToSin( int angle ){ return sintable[get360to256(angle)];}
00080 
00081 #   else //360度型
00082 
00083     bool triginit(void)
00084     {
00085             for (int i = 0; i < DKINGYO_SINTABLESIZE; ++i)
00086             {
00087                 sintable[i] = (float)::sin(DKINGYO_DTOR * i);
00088             }
00089             return true;
00090     }
00092     inline float    fsin(float theta)
00093     {
00094         unsigned int angle = DKINGYO_RTOD * theta;
00095         return sintable[angle];
00096     
00097     }
00099     inline float    fcos(float theta)
00100     {
00101         unsigned int angle = DKINGYO_RTOD * theta;
00102         //360度単位だと、素直にこうするしかないのね・・・
00103         if(angle < 90){angle + DKINGYO_SINTABLESIZE;}
00104         return sintable[angle - 90];
00105         //return sintable[(angle + (DKINGYO_SINTABLESIZE>>2)) ];
00106     }
00111     inline float AngleToCos( int angle ){
00112         return sintable[(angle < 90) ? angle + DKINGYO_SINTABLESIZE : angle ];
00113     }
00115     inline float AngleToSin( int angle ){ return sintable[angle];}
00116 
00117 #endif
00118 
00119 
00121     inline int get360to256( int angle )
00122     {
00123         return ((angle * 256 ) / 360);
00124     }
00125 
00126 
00127 
00129     inline double DegreeToRadian(int angle){    return angle * DKINGYO_DTOR;}
00130     //inline float DegreeToRadian(int angle){   return angle * getPAI() / 180;}
00132     inline int RadianToDegree(double radian){ return (int)(radian * DKINGYO_RTOD);}
00133     //inline int RadianToDegree(float radian){ return (int)(radian * 180 / getPAI());}
00134 
00136     inline float getPAI(){return 3.14159265f;}
00138     inline double getDoublePAI(){return 3.1415926535897932f;}   
00140     inline void SinCos( long angle, float *pSin, float *pCos ){
00141         *pSin = AngleToSin(angle);
00142         *pCos = AngleToCos(angle);
00143     }
00144 
00145 };
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154 }//end of dkutil namespace
00155 
00156 
00157 #endif

dkutil 1.02リリース前 d金魚専用マニュアルバージョンに対してSun Dec 28 21:23:08 2003に生成されました。 doxygen 1.3.5