基本上,每次更新时,我都有一个角度只能改变某个“转弯半径”(比如旋转的60/256)。它由输入角度改变,可以是任何角度。我需要夹住这个输入角度,这样如果它在转弯半径之外,它将转到最近的有效角度
例如:
[0, 360)
之内)或
或
我不确定如何正确包裹角度,所以我有点卡在这里。
答案 0 :(得分:1)
首先,找出原始角度和输入角度之间的差异。 (只需减去。) 然后,"规范化"这个差异在-180度到180度之间。
normalized_difference = (((( raw_difference % 360) + 540) % 360) - 180)
然后,如果"标准化"差异超出了所需范围,将其更改为在范围内。然后将(可能已更改的)归一化差值添加到原始角度以获得输出角度。如果您希望将输出角度标准化为介于0度和359.99度之间,则可以这样做:
normalized_angle = (((raw_angle % 360) + 360) % 360)
答案 1 :(得分:0)
基于@ robert-lozyniak的answer,这就是我最终的结果:
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
}