/* trig.c fast integer trig functions etc. for rubik.c martin round xmas eve 1989 */ #include short sintab [360]; void init_trig() { double degtorad; int i; degtorad = 3.14159/180.0; for (i=1; i<90; i++) { sintab[i] = sintab[180-i] = (short) (0.5 + 256.0 * sin(degtorad * i)); sintab[i+180] = sintab[360-i] = -sintab[i]; } sintab[0] = 0; sintab[90] = 256; sintab[180] = 0; sintab[270] = -256; } short mysin(int ang) /* works with degrees! return is 256*sin(ang) */ { if (ang < 0) return (sintab [ang + 360]); if (ang >359) return (sintab [ang - 360]); return (sintab[ang]); } short mycos(int ang) { if (ang < -90) return (sintab [ang + 450]); if (ang >269) return (sintab [ang - 270]); return (sintab [ang + 90]); } unsigned short hypot ( short x, short y) { register unsigned long square = x * x + y * y; register unsigned short root = x<0 ? -x : x; register unsigned short correction; root += y<0 ? -y+1 : y+1; do { root -= (correction = (root * root - square) / (root * 2)); } while (correction); return (--root); } short angle(short x, short y, unsigned short r) /* find vector */ { register short ang,s,e,sine; short flag; if ((r * x * y) == 0) { if (r == 0) return (0); if (x == 0) { if (y >=0) return (90); else return (-90); } if (x >=0) return (0); else return (180); } ang = y<0 ? -y : y; s = x<0 ? -x : x; if (flag = (s < ang)) ang = s; sine = (ang << 8) / r; ang = 21; s = 92; /* sintab [21] */ e = sine - s; while ((e < -2) || (e > 2)) { if (e > 4) ang += ((46-ang)*e)/(184-s); else if (e < -4) ang -= ((1-ang)*e)/(s-4); else if (e < 0) { --ang; break; } else { ++ang; break; } e = sine-(s = sintab[ang]); } if (flag) ang = 90 - ang; if (x < 0) ang = 180 - ang; if (y < 0) ang = -ang; return (ang); } void rotate (short *a, short *b, short ang) { static short olda,oldb,oldang,olda1,oldb1; unsigned short r; if ((*a == olda) && (*b == oldb) && (ang == oldang)) { *a = olda1; *b = oldb1; } else { olda = *a; oldb = *b; oldang = ang; ang += angle (*a, *b, (r = hypot (*a, *b))); *a = olda1 = (r * mycos(ang)) >> 8; *b = oldb1 = (r * mysin(ang)) >> 8; } }