00001 #include <math.h> 00002 #include <iostream> 00003 00004 #include "nncmath.h" 00005 00006 using namespace std; 00007 00008 //define at file scope 00009 double NNCMath::sinTable[SIN_TABLE_SIZE]; 00010 double NNCMath::cosTable[COS_TABLE_SIZE]; 00011 double NNCMath::tanTable[TAN_TABLE_SIZE]; 00012 double NNCMath::arcSinTable[ARC_SIN_TABLE_SIZE]; 00013 double NNCMath::arcCosTable[ARC_COS_TABLE_SIZE]; 00014 double NNCMath::arcTanTable[ARC_TAN_TABLE_SIZE]; 00015 double NNCMath::sRootTable[ROOT_TABLE_SIZE]; 00016 const double NNCMath::PI = 3.14159265358979323846; 00017 const double NNCMath::TWO_PI = (2 * PI); 00018 const double NNCMath::PI_OVER_TWO = (PI / 2); 00019 00020 //initialize static variables 00021 void NNCMath::MathInit() { 00022 for (int i = 0; i < SIN_TABLE_SIZE; i++) { 00023 sinTable[i] = SIN_DEFAULT_VALUE; 00024 } 00025 for (int i = 0; i < COS_TABLE_SIZE; i++) { 00026 cosTable[i] = COS_DEFAULT_VALUE; 00027 } 00028 for (int i = 0; i < TAN_TABLE_SIZE; i++) { 00029 tanTable[i] = TAN_DEFAULT_VALUE; 00030 } 00031 for (int i = 0; i < ARC_SIN_TABLE_SIZE; i++) { 00032 arcSinTable[i] = ARC_SIN_DEFAULT_VALUE; 00033 } 00034 for (int i = 0; i < ARC_COS_TABLE_SIZE; i++) { 00035 arcCosTable[i] = ARC_COS_DEFAULT_VALUE; 00036 } 00037 for (int i = 0; i < ARC_TAN_TABLE_SIZE; i++) { 00038 arcTanTable[i] = ARC_TAN_DEFAULT_VALUE; 00039 } 00040 for (int i = 0; i < ROOT_TABLE_SIZE; i++) { 00041 sRootTable[i] = ROOT_DEFAULT_VALUE; 00042 } 00043 } 00044 00045 00046 //static functions 00047 00048 //creates a radian and calls the other Sin function 00049 double NNCMath::Sin(degree d) { 00050 radian radianValue; 00051 radianValue.value = d.value * PI / 180.0; 00052 return Sin(radianValue); 00053 } 00054 00055 double NNCMath::Sin(radian r) { 00056 double value; 00057 int valueCast; 00058 00059 value = r.value; 00060 00061 while (value > TWO_PI) 00062 value -= TWO_PI; 00063 00064 while (value < 0) 00065 value += TWO_PI; 00066 00067 valueCast = (int)(value * MULTIPLIER); 00068 if (valueCast > SIN_TABLE_SIZE - 1 || valueCast < 0) return sin(value); 00069 00070 if (sinTable[valueCast] == SIN_DEFAULT_VALUE) { 00071 sinTable[valueCast] = sin(value); 00072 } 00073 00074 return sinTable[valueCast]; 00075 } 00076 00077 00078 double NNCMath::Cos(degree d){ 00079 radian radianValue; 00080 radianValue.value = d.value * PI / 180.0; 00081 return Cos(radianValue); 00082 } 00083 00084 double NNCMath::Cos(radian r) { 00085 double value; 00086 int valueCast; 00087 double check; 00088 00089 value = r.value; 00090 00091 while (value > TWO_PI) { 00092 value -= TWO_PI; 00093 } 00094 00095 while (value < 0) { 00096 value += TWO_PI; 00097 } 00098 00099 valueCast = (int)(value * MULTIPLIER); 00100 if (valueCast > COS_TABLE_SIZE - 1 || valueCast < 0) return 0.0; 00101 00102 check = cosTable[valueCast]; 00103 00104 00105 if (check == COS_DEFAULT_VALUE) { 00106 cosTable[valueCast] = cos(value); 00107 } 00108 00109 return cosTable[valueCast]; 00110 } 00111 00112 double NNCMath::Tan(degree d){ 00113 radian radianValue; 00114 radianValue.value = d.value * PI / 180.0; 00115 return Tan(radianValue); 00116 } 00117 00118 double NNCMath::Tan(radian r) { 00119 double value; 00120 int valueCast; 00121 double check; 00122 00123 value = r.value; 00124 00125 while (value > TWO_PI) { 00126 value -= TWO_PI; 00127 } 00128 00129 while (value < 0) { 00130 value += TWO_PI; 00131 } 00132 00133 if (value == PI_OVER_TWO || value == -PI_OVER_TWO) return 0.0; 00134 00135 valueCast = (int)(value * MULTIPLIER); 00136 if (valueCast > TAN_TABLE_SIZE - 1 || valueCast < 0) return 0.0; 00137 00138 check = tanTable[valueCast]; 00139 00140 00141 if (check == TAN_DEFAULT_VALUE) { 00142 tanTable[valueCast] = tan(value); 00143 } 00144 00145 return tanTable[valueCast]; 00146 } 00147 00148 radian NNCMath::ArcSin(double d){ 00149 radian r; 00150 int index; 00151 double temp; 00152 if (d > 1 || d < -1) r.value = 0.0; 00153 else { 00154 index = (int)(d * MULTIPLIER); 00155 if (arcSinTable[index] == ARC_SIN_DEFAULT_VALUE) { 00156 temp = asin(d); 00157 if (temp < 0) temp += TWO_PI; 00158 arcSinTable[index] = temp; 00159 } 00160 r.value = arcSinTable[index]; 00161 } 00162 return r; 00163 } 00164 00165 radian NNCMath::ArcCos(double d){ 00166 radian r; 00167 int index; 00168 if (d > 1 || d < -1) r.value = 0.0; 00169 else { 00170 index = (int)(d * MULTIPLIER); 00171 if (arcCosTable[index] == ARC_COS_DEFAULT_VALUE) { 00172 arcCosTable[index] = acos(d); 00173 } 00174 r.value = arcCosTable[index]; 00175 } 00176 return r; 00177 } 00178 00179 radian NNCMath::ArcTan(double d){ 00180 radian r; 00181 int index; 00182 double temp; 00183 00184 if (d >= 20) r.value = PI_OVER_TWO; 00185 else if (d <= -20) r.value = -PI_OVER_TWO; 00186 else { 00187 index = (int)( (d + 20) * MULTIPLIER); 00188 if (arcTanTable[index] == ARC_TAN_DEFAULT_VALUE) { 00189 temp = atan(d); 00190 //while (temp < 0) temp += TWO_PI; 00191 arcTanTable[index] = temp; 00192 } 00193 r.value = arcTanTable[index]; 00194 } 00195 return r; 00196 } 00197 00198 double NNCMath::SRoot(double d){ return sqrt(d);} 00199