Go Down

Topic: Calculate the minimum angular movement between two compass points? (Read 349 times) previous topic - next topic

warren631

Does anyone have a handy dandy function to do this (returns results from -180 to +180)?
For example:
move from 90 to 180 = 90 (easy)
move from 180 to 90 = -90 (easy)
move from 45 to 359 = -46 (not so easy)
move from 315 to 90 = 135 (not so easy)
(Clockwise move is positive, anti-clock is negative).

WizenedEE

function:
Code: [Select]
int angDist(int p1, int p2) {
  int rawdist = p2 - p1;
  while (rawdist <  -180) rawdist += 360;
  while (rawdist >= +180) rawdist -= 360;
  return rawdist;
}

and test code:
Code: [Select]
#include <iostream>
using namespace std;

int angDist(int p1, int p2) {
  int rawdist = p2 - p1;
  while (rawdist <  -180) rawdist += 360;
  while (rawdist >= +180) rawdist -= 360;
  return rawdist;
}

#define printfunc(x,y) cout << "x: " << x << "y: " << y << "angDist(x, y): " << angDist(x, y) << endl

int main() {
    printfunc(90, 180);
    printfunc(180, 90);
    printfunc(45, 359);
    printfunc(315,90);
}


prints out results you gave

warren631

Thanks WizenedEE.  I also found these on the internet which might be of use to others looking for such a function:
Code: [Select]
int angle_difference(int target, int head){
  return ((((target - head) % 360) + 540) % 360) - 180;
}

int angleDifference(int target, int head){
  return abs((target + 180 -  head) % 360 - 180);
}

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy