我将如何更新一个角度,但只能在一定范围内?

How would I update an angle, but only within a certain range?

基本上,我有一个角度,每次更新时只能改变某个 "turn radius"(比如旋转的 60/256)。它由可以是任何角度的输入角度改变。我需要限制这个输入角度,这样如果它在转弯半径之外,它就会到达最近的有效角度

例如:

我不确定如何正确地包裹角度,所以我有点卡在这里。

首先求出原始角度与输入角度的差值。 (只是减去。) 然后,"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
}