Untitled

 avatar
unknown
c_cpp
2 months ago
1.4 kB
9
Indexable
// currAngle and targetAngle are between [0..360), where 360->0.


// Calculate the distance between currAngle and targetAngle
// in both the positive (clockwise) and the negative (counterclockwise)
// directions.

double positiveDistance, negativeDistance;
if (targetAngle < currAngle) {
  positiveDistance = targetAngle - currAngle + 360;
  negativeDistance = currAngle - targetAngle;
} else {
  positiveDistance = targetAngle - currAngle;
  negativeDistance = currAngle - targetAngle + 360;
}

// Whichever distance is shorter, move in that direction.

bool movedPositive;
if (negativeDistance < positiveDistance) {
  currAngle--;
  movedPositive = false;
} else {
  currAngle++;
  movedPositive = true;
}

// Now, if we overshot the target, we want to clamp to it.
// Start by checking distance again.

if (targetAngle < currAngle) {
  positiveDistance = targetAngle - currAngle + 360;
  negativeDistance = currAngle - targetAngle;
} else {
  positiveDistance = targetAngle - currAngle;
  negativeDistance = currAngle - targetAngle + 360;
}

// Check if, after we've moved, the target is now in the opposite
// direction. If it is, then we've overshot and need to clamp.

if (negativeDistance < positiveDistance) {
  if (movedPositive) {
    currAngle = targetAngle;
  }
} else {
  if (!movedPositive) {
    currAngle = targetAngle;
  }
}
Editor is loading...
Leave a Comment