• Advertisement
Sign in to follow this  

Modulating and Angle Problem

This topic is 3087 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

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
Advertisement
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
Sign in to follow this  

  • Advertisement