我如何更新角度,但仅在一定范围内?

时间:2017-04-05 01:15:58

标签: math rotation language-agnostic angle

基本上,每次更新时,我都有一个角度只能改变某个“转弯半径”(比如旋转的60/256)。它由输入角度改变,可以是任何角度。我需要夹住这个输入角度,这样如果它在转弯半径之外,它将转到最近的有效角度

例如:

  • 转弯半径:4°
  • 原始角度= 0°
  • 输入角度= 180.01°
  • 输出角度= -4°或356°(实际输出当然应在[0, 360)之内)

  • 转弯半径:4°
  • 原始角度= 0°
  • 输入角度= 179.99°
  • 输出角度= 4°

  • 转弯半径:4°
  • 原角= 45°
  • 输入角度= 46°
  • 输出角度= 46°

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

2 个答案:

答案 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
}