2017-04-05 46 views
1

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

例如:

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

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

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

我不确定如何正确包装一个因此,我有点卡在这里。

+4

你的例子和问题的解释不清楚。尝试重新制定 – MBo

+0

我同意MBo,绝对不清楚为什么179.99°转换为4°,而180.01°转换为356°。在第三个例子中为什么45°改变了? – SergGr

+0

什么是转弯半径(因为您将度设置为单位,因为半径是长度而不是角度,因此不清楚)?也许你想要编码的图像可以帮助更多...因为MBO评论目前还不清楚你的夹紧规则是如何工作的......它们是依赖于以前的价值还是仅仅取决于新的价值。为什么输入〜180度的值被限制在〜0或〜360而不是〜180(如果它可以加上,你也可以用原来的角度'0')?也许增加覆盖整个范围的情节会告诉我们你不能写作文本的能力 – Spektre

回答

1

首先,找出原始角度和输入角度之间的差异。 (就是减去) 然后,将这个差值“正常化”到-180度和180度之间。

normalized_difference = ((((raw_difference % 360) + 540) % 360) - 180) 

然后,如果“归一化”差异在期望范围之外,则将其更改为在范围内。然后添加(可能改变的)归一化差异到原始角度以获得输出角度。如果你想正常化输出角度为0度,359.99 ...度之间,你可以这样做:

normalized_angle = (((raw_angle % 360) + 360) % 360) 
0

基于@罗伯特 - 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 
} 
+0

这是什么语言? –

+0

@RobertLozyniak Rust – kreaTTo