Log in

View Full Version : Trig functions and type conversion


kaszeta
11-01-2006, 21:25
I'm trying to use the CORDIC function to do some basic trig (calculating an angle given an x and y coordinate from a joystick), and I'm getting some odd results.

In short, if I calculate the angle using the atan() function, the results work when y>0, but give incorrect and discontinous results if y<0.

Here's the simplest code that I came up with the recreates the problem:

#include "cordic-math.h" // renamed so that I know it's not the Microchip one

short long joyx,joyy;
short long theta;

joyx=(255-p1_x)-127;
joyy=p1_y-127;

theta=atan(joyy,joyx);

printf("theta: %d ",(int)(theta>>16));

Anyone have some thoughts? I at first thought it was a problem with negative numbers and the >> operator, but theta/65536 gives the same
numbers.

Alan Anderson
12-01-2006, 10:34
In short, if I calculate the angle using the atan() function, the results work when y>0, but give incorrect and discontinous results if y<0.
That's just the nature of arc tangents. You need to determine which quadrant you're in and offset the answer accordingly. Some trig libraries provide an atan2() function that deals with the issue for you.

kaszeta
12-01-2006, 10:57
That's just the nature of arc tangents. You need to determine which quadrant you're in and offset the answer accordingly. Some trig libraries provide an atan2() function that deals with the issue for you.

Hmmm, I assumed since the CORDIC library atan function took two arguments it was an atan2 function, but it appears I assumed incorrectly. Thanks.

TechnocratiK
12-01-2006, 17:40
Did you write the library, or get it somewhere?

p1r0o2g7
14-01-2006, 16:40
why don't you use the math.h header. i'm pretty sure it has all the trig functions.

http://www.cplusplus.com/ref/cmath/

kaszeta
14-01-2006, 17:22
Did you write the library, or get it somewhere?

It's the CORDIC library from the Whitepapers section here on CD. You can get it here (http://www.chiefdelphi.com/forums/papers.php?s=&action=single&paperid=378)

I was trying to use it instead of the standard math.h since it uses integer math instead of floating point, so it's much faster (and smaller).

For now, I'm using the standard math.h, but if our team's code gets too complicated, I might revisit this.

TechnocratiK
14-01-2006, 23:34
OK, although my good friend Pat Fairbank posted the algorithm, I wrote it, and can assure you that there is a flaw in it (although I haven't had the time to look at it). Moreover, although theoretically the integer math should be faster, in empirical tests, the stock math library proved to be about 6 times faster than the CORDIC algorithm I wrote. Although at the moment I have no plans to rewrite the CORDIC algorithm, given enough public pressure, I might consider doing so. Sorry for the inconvenience.