icossin2.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       icossin2.c (4586B)
       ---
            1 #include "u.h"
            2 #include "lib.h"
            3 #include "draw.h"
            4 
            5 /*
            6  * Sine and Cosine of arctangents, calculated by 
            7  *   (sin(atan(index/100.0))*1024.+0.5)
            8  *   (cos(atan(index/100.0))*1024.+0.5)
            9  * To use, get rational tangent between 0<=tan<=1, scale by 100,
           10  * and look up sin and cos, and use linear interpolation.  divide by 1024.
           11  * Maximum error is 0.0020.  Without linear interpolation, it's 0.010.
           12  */
           13 static
           14 short sinus[] = {
           15         0,        /* 0.00 */
           16         10,        /* 0.01 */
           17         20,        /* 0.02 */
           18         31,        /* 0.03 */
           19         41,        /* 0.04 */
           20         51,        /* 0.05 */
           21         61,        /* 0.06 */
           22         72,        /* 0.07 */
           23         82,        /* 0.08 */
           24         92,        /* 0.09 */
           25         102,        /* 0.10 */
           26         112,        /* 0.11 */
           27         122,        /* 0.12 */
           28         132,        /* 0.13 */
           29         142,        /* 0.14 */
           30         152,        /* 0.15 */
           31         162,        /* 0.16 */
           32         172,        /* 0.17 */
           33         181,        /* 0.18 */
           34         191,        /* 0.19 */
           35         201,        /* 0.20 */
           36         210,        /* 0.21 */
           37         220,        /* 0.22 */
           38         230,        /* 0.23 */
           39         239,        /* 0.24 */
           40         248,        /* 0.25 */
           41         258,        /* 0.26 */
           42         267,        /* 0.27 */
           43         276,        /* 0.28 */
           44         285,        /* 0.29 */
           45         294,        /* 0.30 */
           46         303,        /* 0.31 */
           47         312,        /* 0.32 */
           48         321,        /* 0.33 */
           49         330,        /* 0.34 */
           50         338,        /* 0.35 */
           51         347,        /* 0.36 */
           52         355,        /* 0.37 */
           53         364,        /* 0.38 */
           54         372,        /* 0.39 */
           55         380,        /* 0.40 */
           56         388,        /* 0.41 */
           57         397,        /* 0.42 */
           58         405,        /* 0.43 */
           59         412,        /* 0.44 */
           60         420,        /* 0.45 */
           61         428,        /* 0.46 */
           62         436,        /* 0.47 */
           63         443,        /* 0.48 */
           64         451,        /* 0.49 */
           65         458,        /* 0.50 */
           66         465,        /* 0.51 */
           67         472,        /* 0.52 */
           68         480,        /* 0.53 */
           69         487,        /* 0.54 */
           70         493,        /* 0.55 */
           71         500,        /* 0.56 */
           72         507,        /* 0.57 */
           73         514,        /* 0.58 */
           74         520,        /* 0.59 */
           75         527,        /* 0.60 */
           76         533,        /* 0.61 */
           77         540,        /* 0.62 */
           78         546,        /* 0.63 */
           79         552,        /* 0.64 */
           80         558,        /* 0.65 */
           81         564,        /* 0.66 */
           82         570,        /* 0.67 */
           83         576,        /* 0.68 */
           84         582,        /* 0.69 */
           85         587,        /* 0.70 */
           86         593,        /* 0.71 */
           87         598,        /* 0.72 */
           88         604,        /* 0.73 */
           89         609,        /* 0.74 */
           90         614,        /* 0.75 */
           91         620,        /* 0.76 */
           92         625,        /* 0.77 */
           93         630,        /* 0.78 */
           94         635,        /* 0.79 */
           95         640,        /* 0.80 */
           96         645,        /* 0.81 */
           97         649,        /* 0.82 */
           98         654,        /* 0.83 */
           99         659,        /* 0.84 */
          100         663,        /* 0.85 */
          101         668,        /* 0.86 */
          102         672,        /* 0.87 */
          103         676,        /* 0.88 */
          104         681,        /* 0.89 */
          105         685,        /* 0.90 */
          106         689,        /* 0.91 */
          107         693,        /* 0.92 */
          108         697,        /* 0.93 */
          109         701,        /* 0.94 */
          110         705,        /* 0.95 */
          111         709,        /* 0.96 */
          112         713,        /* 0.97 */
          113         717,        /* 0.98 */
          114         720,        /* 0.99 */
          115         724,        /* 1.00 */
          116         728,        /* 1.01 */
          117 };
          118 
          119 static
          120 short cosinus[] = {
          121         1024,        /* 0.00 */
          122         1024,        /* 0.01 */
          123         1024,        /* 0.02 */
          124         1024,        /* 0.03 */
          125         1023,        /* 0.04 */
          126         1023,        /* 0.05 */
          127         1022,        /* 0.06 */
          128         1022,        /* 0.07 */
          129         1021,        /* 0.08 */
          130         1020,        /* 0.09 */
          131         1019,        /* 0.10 */
          132         1018,        /* 0.11 */
          133         1017,        /* 0.12 */
          134         1015,        /* 0.13 */
          135         1014,        /* 0.14 */
          136         1013,        /* 0.15 */
          137         1011,        /* 0.16 */
          138         1010,        /* 0.17 */
          139         1008,        /* 0.18 */
          140         1006,        /* 0.19 */
          141         1004,        /* 0.20 */
          142         1002,        /* 0.21 */
          143         1000,        /* 0.22 */
          144         998,        /* 0.23 */
          145         996,        /* 0.24 */
          146         993,        /* 0.25 */
          147         991,        /* 0.26 */
          148         989,        /* 0.27 */
          149         986,        /* 0.28 */
          150         983,        /* 0.29 */
          151         981,        /* 0.30 */
          152         978,        /* 0.31 */
          153         975,        /* 0.32 */
          154         972,        /* 0.33 */
          155         969,        /* 0.34 */
          156         967,        /* 0.35 */
          157         963,        /* 0.36 */
          158         960,        /* 0.37 */
          159         957,        /* 0.38 */
          160         954,        /* 0.39 */
          161         951,        /* 0.40 */
          162         947,        /* 0.41 */
          163         944,        /* 0.42 */
          164         941,        /* 0.43 */
          165         937,        /* 0.44 */
          166         934,        /* 0.45 */
          167         930,        /* 0.46 */
          168         927,        /* 0.47 */
          169         923,        /* 0.48 */
          170         920,        /* 0.49 */
          171         916,        /* 0.50 */
          172         912,        /* 0.51 */
          173         909,        /* 0.52 */
          174         905,        /* 0.53 */
          175         901,        /* 0.54 */
          176         897,        /* 0.55 */
          177         893,        /* 0.56 */
          178         890,        /* 0.57 */
          179         886,        /* 0.58 */
          180         882,        /* 0.59 */
          181         878,        /* 0.60 */
          182         874,        /* 0.61 */
          183         870,        /* 0.62 */
          184         866,        /* 0.63 */
          185         862,        /* 0.64 */
          186         859,        /* 0.65 */
          187         855,        /* 0.66 */
          188         851,        /* 0.67 */
          189         847,        /* 0.68 */
          190         843,        /* 0.69 */
          191         839,        /* 0.70 */
          192         835,        /* 0.71 */
          193         831,        /* 0.72 */
          194         827,        /* 0.73 */
          195         823,        /* 0.74 */
          196         819,        /* 0.75 */
          197         815,        /* 0.76 */
          198         811,        /* 0.77 */
          199         807,        /* 0.78 */
          200         804,        /* 0.79 */
          201         800,        /* 0.80 */
          202         796,        /* 0.81 */
          203         792,        /* 0.82 */
          204         788,        /* 0.83 */
          205         784,        /* 0.84 */
          206         780,        /* 0.85 */
          207         776,        /* 0.86 */
          208         773,        /* 0.87 */
          209         769,        /* 0.88 */
          210         765,        /* 0.89 */
          211         761,        /* 0.90 */
          212         757,        /* 0.91 */
          213         754,        /* 0.92 */
          214         750,        /* 0.93 */
          215         746,        /* 0.94 */
          216         742,        /* 0.95 */
          217         739,        /* 0.96 */
          218         735,        /* 0.97 */
          219         731,        /* 0.98 */
          220         728,        /* 0.99 */
          221         724,        /* 1.00 */
          222         720,        /* 1.01 */
          223 };
          224 
          225 void
          226 icossin2(int x, int y, int *cosp, int *sinp)
          227 {
          228         int sinsign, cossign, tan, tan10, rem;
          229         short *stp, *ctp;
          230 
          231         if(x == 0){
          232                 if(y >= 0)
          233                         *sinp = ICOSSCALE, *cosp = 0;
          234                 else
          235                         *sinp = -ICOSSCALE, *cosp = 0;
          236                 return;
          237         }
          238         sinsign = cossign = 1;
          239         if(x < 0){
          240                 cossign = -1;
          241                 x = -x;
          242         }
          243         if(y < 0){
          244                 sinsign = -1;
          245                 y = -y;
          246         }
          247         if(y > x){
          248                 tan = 1000*x/y;
          249                 tan10 = tan/10;
          250                 stp = &cosinus[tan10];
          251                 ctp = &sinus[tan10];
          252         }else{
          253                 tan = 1000*y/x;
          254                 tan10 = tan/10;
          255                 stp = &sinus[tan10];
          256                 ctp = &cosinus[tan10];
          257         }
          258         rem = tan-(tan10*10);
          259         *sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10);
          260         *cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10);
          261 }