我将如何更新一个角度,但只能在一定范围内?
How would I update an angle, but only within a certain range?
基本上,我有一个角度,每次更新时只能改变某个 "turn radius"(比如旋转的 60/256)。它由可以是任何角度的输入角度改变。我需要限制这个输入角度,这样如果它在转弯半径之外,它就会到达最近的有效角度
例如:
- 转弯半径:4°
- 原始角度 = 0°
- 输入角度 = 180.01°
- 输出角度=-4°或356°(实际输出当然应该在
[0, 360)
以内)
或
- 转弯半径:4°
- 原始角度 = 0°
- 输入角度 = 179.99°
- 输出角=4°
或
- 转弯半径:4°
- 原始角度 = 45°
- 输入角度 = 46°
- 输出角=46°
我不确定如何正确地包裹角度,所以我有点卡在这里。
首先求出原始角度与输入角度的差值。 (只是减去。)
然后,"normalize"这个差值在-180度和180度之间。
normalized_difference = (((( raw_difference % 360) + 540) % 360) - 180)
然后,如果 "normalized" 差异超出所需范围,则将其更改为在范围内。然后将(可能改变的)归一化差值添加到原始角度以获得输出角度。如果您希望将输出角度归一化到 0 度和 359.99... 度之间,您可以这样做:
normalized_angle = (((raw_angle % 360) + 360) % 360)
基于@robert-lozyniak 的,这就是我最终得到的结果:
fn clamp_angle_update(angle: u8, target: u8, limit: u8) -> u8 {
let mut difference = target as isize - angle as isize;
// normalize the difference
difference += 256 + 256 / 2;
difference %= 256;
difference -= 256 / 2;
let limit = limit as isize;
difference = if difference > limit {
limit
} else if difference < -limit {
-limit
} else { difference };
// add the difference to the original angle
let mut angle = angle as isize + difference;
// normalize the angle
angle %= 256;
angle += 256;
angle %= 256;
angle as u8
}
基本上,我有一个角度,每次更新时只能改变某个 "turn radius"(比如旋转的 60/256)。它由可以是任何角度的输入角度改变。我需要限制这个输入角度,这样如果它在转弯半径之外,它就会到达最近的有效角度
例如:
- 转弯半径:4°
- 原始角度 = 0°
- 输入角度 = 180.01°
- 输出角度=-4°或356°(实际输出当然应该在
[0, 360)
以内)
或
- 转弯半径:4°
- 原始角度 = 0°
- 输入角度 = 179.99°
- 输出角=4°
或
- 转弯半径:4°
- 原始角度 = 45°
- 输入角度 = 46°
- 输出角=46°
我不确定如何正确地包裹角度,所以我有点卡在这里。
首先求出原始角度与输入角度的差值。 (只是减去。) 然后,"normalize"这个差值在-180度和180度之间。
normalized_difference = (((( raw_difference % 360) + 540) % 360) - 180)
然后,如果 "normalized" 差异超出所需范围,则将其更改为在范围内。然后将(可能改变的)归一化差值添加到原始角度以获得输出角度。如果您希望将输出角度归一化到 0 度和 359.99... 度之间,您可以这样做:
normalized_angle = (((raw_angle % 360) + 360) % 360)
基于@robert-lozyniak 的
fn clamp_angle_update(angle: u8, target: u8, limit: u8) -> u8 {
let mut difference = target as isize - angle as isize;
// normalize the difference
difference += 256 + 256 / 2;
difference %= 256;
difference -= 256 / 2;
let limit = limit as isize;
difference = if difference > limit {
limit
} else if difference < -limit {
-limit
} else { difference };
// add the difference to the original angle
let mut angle = angle as isize + difference;
// normalize the angle
angle %= 256;
angle += 256;
angle %= 256;
angle as u8
}