Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages  

nncmath.cpp

Go to the documentation of this file.
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 

Generated on Sun Dec 8 12:02:19 2002 for nnc by doxygen1.3-rc1