Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include        <u.h>
#include        <libc.h>
#include        <draw.h>

/*
 * Sine and Cosine of arctangents, calculated by 
 *   (sin(atan(index/100.0))*1024.+0.5)
 *   (cos(atan(index/100.0))*1024.+0.5)
 * To use, get rational tangent between 0<=tan<=1, scale by 100,
 * and look up sin and cos, and use linear interpolation.  divide by 1024.
 * Maximum error is 0.0020.  Without linear interpolation, it's 0.010.
 */
static
short sinus[] = {
        0,      /* 0.00 */
        10,     /* 0.01 */
        20,     /* 0.02 */
        31,     /* 0.03 */
        41,     /* 0.04 */
        51,     /* 0.05 */
        61,     /* 0.06 */
        72,     /* 0.07 */
        82,     /* 0.08 */
        92,     /* 0.09 */
        102,    /* 0.10 */
        112,    /* 0.11 */
        122,    /* 0.12 */
        132,    /* 0.13 */
        142,    /* 0.14 */
        152,    /* 0.15 */
        162,    /* 0.16 */
        172,    /* 0.17 */
        181,    /* 0.18 */
        191,    /* 0.19 */
        201,    /* 0.20 */
        210,    /* 0.21 */
        220,    /* 0.22 */
        230,    /* 0.23 */
        239,    /* 0.24 */
        248,    /* 0.25 */
        258,    /* 0.26 */
        267,    /* 0.27 */
        276,    /* 0.28 */
        285,    /* 0.29 */
        294,    /* 0.30 */
        303,    /* 0.31 */
        312,    /* 0.32 */
        321,    /* 0.33 */
        330,    /* 0.34 */
        338,    /* 0.35 */
        347,    /* 0.36 */
        355,    /* 0.37 */
        364,    /* 0.38 */
        372,    /* 0.39 */
        380,    /* 0.40 */
        388,    /* 0.41 */
        397,    /* 0.42 */
        405,    /* 0.43 */
        412,    /* 0.44 */
        420,    /* 0.45 */
        428,    /* 0.46 */
        436,    /* 0.47 */
        443,    /* 0.48 */
        451,    /* 0.49 */
        458,    /* 0.50 */
        465,    /* 0.51 */
        472,    /* 0.52 */
        480,    /* 0.53 */
        487,    /* 0.54 */
        493,    /* 0.55 */
        500,    /* 0.56 */
        507,    /* 0.57 */
        514,    /* 0.58 */
        520,    /* 0.59 */
        527,    /* 0.60 */
        533,    /* 0.61 */
        540,    /* 0.62 */
        546,    /* 0.63 */
        552,    /* 0.64 */
        558,    /* 0.65 */
        564,    /* 0.66 */
        570,    /* 0.67 */
        576,    /* 0.68 */
        582,    /* 0.69 */
        587,    /* 0.70 */
        593,    /* 0.71 */
        598,    /* 0.72 */
        604,    /* 0.73 */
        609,    /* 0.74 */
        614,    /* 0.75 */
        620,    /* 0.76 */
        625,    /* 0.77 */
        630,    /* 0.78 */
        635,    /* 0.79 */
        640,    /* 0.80 */
        645,    /* 0.81 */
        649,    /* 0.82 */
        654,    /* 0.83 */
        659,    /* 0.84 */
        663,    /* 0.85 */
        668,    /* 0.86 */
        672,    /* 0.87 */
        676,    /* 0.88 */
        681,    /* 0.89 */
        685,    /* 0.90 */
        689,    /* 0.91 */
        693,    /* 0.92 */
        697,    /* 0.93 */
        701,    /* 0.94 */
        705,    /* 0.95 */
        709,    /* 0.96 */
        713,    /* 0.97 */
        717,    /* 0.98 */
        720,    /* 0.99 */
        724,    /* 1.00 */
        728,    /* 1.01 */
};

static
short cosinus[] = {
        1024,   /* 0.00 */
        1024,   /* 0.01 */
        1024,   /* 0.02 */
        1024,   /* 0.03 */
        1023,   /* 0.04 */
        1023,   /* 0.05 */
        1022,   /* 0.06 */
        1022,   /* 0.07 */
        1021,   /* 0.08 */
        1020,   /* 0.09 */
        1019,   /* 0.10 */
        1018,   /* 0.11 */
        1017,   /* 0.12 */
        1015,   /* 0.13 */
        1014,   /* 0.14 */
        1013,   /* 0.15 */
        1011,   /* 0.16 */
        1010,   /* 0.17 */
        1008,   /* 0.18 */
        1006,   /* 0.19 */
        1004,   /* 0.20 */
        1002,   /* 0.21 */
        1000,   /* 0.22 */
        998,    /* 0.23 */
        996,    /* 0.24 */
        993,    /* 0.25 */
        991,    /* 0.26 */
        989,    /* 0.27 */
        986,    /* 0.28 */
        983,    /* 0.29 */
        981,    /* 0.30 */
        978,    /* 0.31 */
        975,    /* 0.32 */
        972,    /* 0.33 */
        969,    /* 0.34 */
        967,    /* 0.35 */
        963,    /* 0.36 */
        960,    /* 0.37 */
        957,    /* 0.38 */
        954,    /* 0.39 */
        951,    /* 0.40 */
        947,    /* 0.41 */
        944,    /* 0.42 */
        941,    /* 0.43 */
        937,    /* 0.44 */
        934,    /* 0.45 */
        930,    /* 0.46 */
        927,    /* 0.47 */
        923,    /* 0.48 */
        920,    /* 0.49 */
        916,    /* 0.50 */
        912,    /* 0.51 */
        909,    /* 0.52 */
        905,    /* 0.53 */
        901,    /* 0.54 */
        897,    /* 0.55 */
        893,    /* 0.56 */
        890,    /* 0.57 */
        886,    /* 0.58 */
        882,    /* 0.59 */
        878,    /* 0.60 */
        874,    /* 0.61 */
        870,    /* 0.62 */
        866,    /* 0.63 */
        862,    /* 0.64 */
        859,    /* 0.65 */
        855,    /* 0.66 */
        851,    /* 0.67 */
        847,    /* 0.68 */
        843,    /* 0.69 */
        839,    /* 0.70 */
        835,    /* 0.71 */
        831,    /* 0.72 */
        827,    /* 0.73 */
        823,    /* 0.74 */
        819,    /* 0.75 */
        815,    /* 0.76 */
        811,    /* 0.77 */
        807,    /* 0.78 */
        804,    /* 0.79 */
        800,    /* 0.80 */
        796,    /* 0.81 */
        792,    /* 0.82 */
        788,    /* 0.83 */
        784,    /* 0.84 */
        780,    /* 0.85 */
        776,    /* 0.86 */
        773,    /* 0.87 */
        769,    /* 0.88 */
        765,    /* 0.89 */
        761,    /* 0.90 */
        757,    /* 0.91 */
        754,    /* 0.92 */
        750,    /* 0.93 */
        746,    /* 0.94 */
        742,    /* 0.95 */
        739,    /* 0.96 */
        735,    /* 0.97 */
        731,    /* 0.98 */
        728,    /* 0.99 */
        724,    /* 1.00 */
        720,    /* 1.01 */
};

void
icossin2(int x, int y, int *cosp, int *sinp)
{
        int sinsign, cossign, tan, tan10, rem;
        short *stp, *ctp;

        if(x == 0){
                if(y >= 0)
                        *sinp = ICOSSCALE, *cosp = 0;
                else
                        *sinp = -ICOSSCALE, *cosp = 0;
                return;
        }
        sinsign = cossign = 1;
        if(x < 0){
                cossign = -1;
                x = -x;
        }
        if(y < 0){
                sinsign = -1;
                y = -y;
        }
        if(y > x){
                tan = 1000*x/y;
                tan10 = tan/10;
                stp = &cosinus[tan10];
                ctp = &sinus[tan10];
        }else{
                tan = 1000*y/x;
                tan10 = tan/10;
                stp = &sinus[tan10];
                ctp = &cosinus[tan10];
        }
        rem = tan-(tan10*10);
        *sinp = sinsign*(stp[0]+(stp[1]-stp[0])*rem/10);
        *cosp = cossign*(ctp[0]+(ctp[1]-ctp[0])*rem/10);
}