#ifndef _Fixed_Angle_H_ #define _Fixed_Angle_H_ #include "FixedPointNum.h" namespace FixedMath { //一周を表す角度 const int AngleBit = 10; const int AngleNum = 1 << AngleBit; //Sqrtの小数点以下の精度 0 〜 FixedShift (bit) const int SqrtBelowPointPrecision = 4; //そのままテーブルのサイズとなる //アークタンジェントテーブルのサイズ const int AtanTableBit = AngleBit - 3; //基本的にこれで充分 class MathTable { private: struct TableData { TableData(void); short SinTable[AngleNum]; short SqrtTable[1 << (2 + SqrtBelowPointPrecision)]; short AtanTable[(1 << AtanTableBit) + 1]; }; static TableData Table; friend Fixed Cos(short angle); friend Fixed Sin(short angle); friend Fixed Sqrt(Fixed square); friend short Atan(long x,long y); }; inline Fixed Cos(short angle) {return Fixed::FixedValue(MathTable::Table.SinTable[(angle + AngleNum / 4) & (AngleNum - 1)]);} inline Fixed Sin(short angle) {return Fixed::FixedValue(MathTable::Table.SinTable[angle & (AngleNum - 1)]);} Fixed Sqrt(Fixed square); short Atan(long x,long y); } #endif