1 /* trig.c fast integer trig functions etc. for rubik.c
2 martin round xmas eve 1989
14 degtorad
= 3.14159/180.0;
17 sintab
[i
] = sintab
[180-i
] = (short) (0.5 + 256.0 * sin(degtorad
* i
));
18 sintab
[i
+180] = sintab
[360-i
] = -sintab
[i
];
27 short mysin(int ang
) /* works with degrees! return is 256*sin(ang) */
31 return (sintab
[ang
+ 360]);
34 return (sintab
[ang
- 360]);
42 return (sintab
[ang
+ 450]);
45 return (sintab
[ang
- 270]);
47 return (sintab
[ang
+ 90]);
50 unsigned short hypoten ( short x
, short y
)
52 register unsigned long square
= x
* x
+ y
* y
;
53 register unsigned short root
= x
<0 ? -x
: x
;
54 register unsigned short correction
;
56 root
+= y
<0 ? -y
+1 : y
+1;
60 root
-= (correction
= (root
* root
- square
) / (root
* 2));
66 short angle(short x
, short y
, unsigned short r
) /* find vector */
68 register short ang
,s
,e
,sine
;
92 if ((flag
= (s
< ang
)))
95 sine
= (ang
<< 8) / r
;
98 s
= 92; /* sintab [21] */
101 while ((e
< -2) || (e
> 2))
104 ang
+= ((46-ang
)*e
)/(184-s
);
106 ang
-= ((1-ang
)*e
)/(s
-4);
118 e
= sine
-(s
= sintab
[ang
]);
133 void rotate (short *a
, short *b
, short ang
)
135 static short olda
,oldb
,oldang
,olda1
,oldb1
;
138 if ((*a
== olda
) && (*b
== oldb
) && (ang
== oldang
))
149 ang
+= angle (*a
, *b
, (r
= hypoten (*a
, *b
)));
151 *a
= olda1
= (r
* mycos(ang
)) >> 8;
152 *b
= oldb1
= (r
* mysin(ang
)) >> 8;