taiga watanabe / table
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers table.cpp Source File

table.cpp

00001 #include "math.h"
00002 #include "mbed.h"
00003 
00004 class table{
00005 public:
00006   table(int times);
00007   ~table();
00008   void SIN_table(void);
00009   void COS_table(void);
00010   void make_table(double (*fnc)(int));
00011   double show(int num);
00012   double deg(double degree);
00013   double rad(double radian);
00014 private:
00015   double M_PI = 3.141592653589793;
00016   double *ans;
00017   int number;
00018 };
00019 table::table(int times){
00020   number = times;
00021 }
00022 table::~table(){
00023   free(ans);
00024 }
00025 void table::SIN_table(void){
00026   ans = (double*)malloc(sizeof(double)*number+1);
00027   //ans = new double[sizeof(double)*number+1];
00028   if(ans == NULL) exit(1);
00029   for(int i=0;i<number+1;i++){//[0]~[number]
00030     ans[i] = sin(M_PI*i*2.0/number);
00031   }
00032 }
00033 void table::COS_table(void){
00034   ans = (double*)malloc(sizeof(double)*number+1);
00035   for(int i=0;i<number+1;i++){
00036     ans[i] = cos(M_PI*i*2.0/number);
00037   }
00038 }
00039 void table::make_table(double (*fnc)(int)){
00040   ans = (double*)malloc(sizeof(double)*number+1);
00041   for(int i=0;i<number+1;i++){
00042     ans[i] = fnc(i);
00043   }
00044 }
00045 double table::show(int num){
00046   return ans[num];
00047 }
00048 double table::deg(double degree){
00049   double sa_db=0.0;
00050   int sa_int=0;
00051   double degree_abs =0.0;
00052   int degree_int=0;
00053   if(degree<0) degree_abs = labs(degree);
00054   else degree_abs = degree;
00055   if(degree_abs>360){
00056     degree_int = degree/360;
00057     degree = degree - degree_int*360;
00058   }
00059   if(degree<0) degree = degree+360;
00060   sa_db = number*0.5*degree/180;
00061   sa_int = sa_db;
00062   return ans[sa_int];
00063   //return ans[sa_int];
00064   //return sa_db;
00065 }
00066 double table::rad(double radian){
00067   double sa_db;
00068   int sa_int;
00069   double radian_abs;
00070   int radian_int;
00071   radian = radian/M_PI;
00072 
00073   if(radian<0) radian_abs = labs(radian);
00074   else radian_abs = radian;
00075 
00076   if(radian_abs>2.0){
00077     radian_int = radian/2.0;
00078     radian = radian - radian_int*2.0;
00079   }
00080 
00081   if(radian<0) radian = radian+2.0;
00082 
00083   sa_db = number*radian*0.5;
00084   sa_int = sa_db;
00085   sa_db = ans[sa_int];
00086   return sa_db;
00087 }