Sign in to follow this  
thekiwimaddog

Modulating and Angle Problem

Recommended Posts

I have a problem with I am Modulating AngleA to keep it positive and Never more than a single Radian by the following: AngleA = fmod(AngleA,(PI * 2)); if(AngleA < 0) { AngleA += (PI * 2); } This is fine but However. . . Later in the program I need to caculate if AngleA is within a certain range of AngleB. The trouble is that If I use the following Code: if(AngleA < (AngleB + 0.3) && AngleA > (AngleB - 0.3)) { //Do Things Here } Then I have a problem if AngleB is hovering around zero as it will generate a minus which won't be factored in. So if I was instead to do this: if(AngleA < fmod(AngleB + 0.3,PI * 2) && AngleA > fmod(AngleB - 0.3,PI * 2)) { //Do Things Here } This still don't work as now the modulated minus is now greater that the Original Angle so is false. Any Ideas. I'm sure that I'm missing something really simple here! Many Thanks David

Share this post


Link to post
Share on other sites
First of all, you probably don't need to use angles: Your life will be easier if instead of an angle you keep a vector that contains (cos(angle),sin(angle)).

If you are working with angles, you should probably use a function that computes the distance between angles:
double angle_distance(double a, double b) {
double answer = fmod(abs(a-b), 2*PI);
return min(answer, 2*PI-answer);
}


Now your test would be
if (angle_distance(AngleA, AngleB) < 0.3)
// ...

Share this post


Link to post
Share on other sites
Quote:
Original post by alvaroYour life will be easier if instead of an angle you keep a vector that contains (cos(angle),sin(angle)).


...in which case the signed angle between two vectors u1 and u2 is given by,

theta = asin(cross2d(u1, u2))

where cross2d denotes the "scalar-valued 2d cross product,"


| u1_x u2_x |
cross2d(u1,u2) = | | = u1_x u2_y - u2_x u1_y
| u1_y u2_y |

which is easy to compute; it's just two MULS, a SUB, and no branches.

Share this post


Link to post
Share on other sites
Quote:
Original post by alvaro

If you are working with angles, you should probably use a function that computes the distance between angles:
double angle_distance(double a, double b) {
double answer = fmod(abs(a-b), 2*PI);
return min(answer, 2*PI-answer);
}



Thanks That's Exactly What I Needed! :)

Share this post


Link to post
Share on other sites
Quote:
Original post by thekiwimaddog
Quote:
Original post by alvaro

If you are working with angles, you should probably use a function that computes the distance between angles:
double angle_distance(double a, double b) {
double answer = fmod(abs(a-b), 2*PI);
return min(answer, 2*PI-answer);
}



Thanks That's Exactly What I Needed! :)


You are welcome. I believe what you really need is the part of the post you didn't quote (Don't use angles), but it may take some time to sink in.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this