Subversion Repositories libOLED

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * ap_math.c
  3.  
  4.  *
  5.  *  Created on: 31 Jan 2016
  6.  *      Author: Mike
  7.  */
  8.  
  9. #include <math.h>
  10. #include "libOLED/ap_math.h"
  11. /* this is an approximate maths library where all the answers are accurate enough */
  12. ap_math::ap_math()
  13.   {
  14.     uint16_t i;
  15.     for(i=0;i<SINE_STEPS;i++)
  16.         sintab[i]=sin(i/(SINE_STEPS*2.0)*3.14159)*AP_K;
  17.   }
  18.  
  19. /* returns 255 * sin(ang) where ang is in degrees */
  20. int
  21. ap_math::ap_sin (int ang)
  22. {
  23.   /* wrap into range */
  24.   while (ang < 0)
  25.     {
  26.       ang += SINE_STEPS * 4;
  27.     }
  28.   while (ang >= SINE_STEPS * 4)
  29.     {
  30.       ang -= SINE_STEPS * 4;
  31.     }
  32.  
  33.   if (ang >= 0 && ang < SINE_STEPS)
  34.     {
  35.       return (sintab[ang]);
  36.     }
  37.   else if (ang == SINE_STEPS)
  38.     {
  39.       return AP_K;
  40.     }
  41.   else if (ang > SINE_STEPS && ang <= SINE_STEPS * 2)
  42.     {
  43.       return (sintab[SINE_STEPS * 2 - ang]);
  44.     }
  45.   else if (ang == 3 * SINE_STEPS)
  46.     {
  47.       return -AP_K;
  48.     }
  49.   if (ang > SINE_STEPS * 2 && ang < SINE_STEPS * 3)
  50.     {
  51.       return (-sintab[ang - SINE_STEPS * 2]);
  52.     }
  53.   else
  54.   /* ang > 270 and ang < 360 */
  55.     {
  56.       return (-sintab[SINE_STEPS * 4 - ang]);
  57.     }
  58. }
  59.  
  60. /* returns 255 * cos(ang) where ang is in degrees */
  61. int
  62. ap_math::ap_cos (int ang)
  63. {
  64.   return ap_sin (SINE_STEPS - ang);
  65. }
  66.  
  67.