If I have an angle theta (radians), a small angle delta (radians) and a target angle theta prime (radians), how can I increment/decrement theta by delta such that it would move closer to the angle theta prime? The goal is to push it closer and eventually reach and equal theta prime (but not go past it). It should work for negative radians or radians that are above Math.PI or lower than -Math.PI.
something like this
function MoveTheta(theta, delta, theta_prime) {
// magic to move theta by at most delta closer to theta_prime
return new_theta_value;
}
I would keep calling MoveTheta until MoveTheta equals theta_prime. How could this be written?
function MoveTheta(theta, delta, theta_prime) {
// find the distance between theta and theta_prime
var diff = theta_prime - theta;
// find the number of times you need to add/subtract delta to theta in order
// to get to theta_prime (without passing theta_prime)
var deltas = Math.floor(diff / delta);
var new_theta_value = theta + deltas * delta;
return new_theta_value;
}
Is this what you're looking for?
You can try the following solution:
First evaluate the distance from the target angle . Then if the distance is less than the step return the target angle or the original angle plus the step multiplied by the sign of the difference to take into account the direction of the rotation.
function move(
theta, // the original angle
delta, // the step
theta_prime // the target angle
)
{
const diff = theta_prime - theta;
return Math.abs(diff) > delta ? tetha + Math.sign(diff) * delta : tetha_prime;
}
if the result of this method is equal to the target angle than the procedure is complete.
function move(theta, delta, theta_prime) {
const diff = theta_prime - theta;
return Math.abs(diff) > delta ? theta + Math.sign(diff) * delta : tetha_prime;
}
let theta = 75;
const delta = 4;
const theta_prime = 32;
while (theta != theta_prime) {
theta = move(theta, delta, theta_prime);
console.log(theta);
}
console.log("done");
Unless you don't care about usage of trig. functions, try the next approach (should solve problems with transition over zero, choose shortest direction etc):
rot = atan2(cos(th)*sin(th_pr)-cos(th_pr)*sin(th),
cos(th)*cos(th_pr)+sin(th_pr)*sin(th))
if rot >= 0
new_th = th + min(delta, rot)
else
new_th = th + max(-delta, rot)