Math 如何更新角度,但仅在特定范围内?

Math 如何更新角度,但仅在特定范围内?,math,rotation,language-agnostic,angle,Math,Rotation,Language Agnostic,Angle,基本上,我有一个角度,每次更新时只能改变某个“转弯半径”(比如,60/256的旋转)。它由输入角度更改,输入角度可以是任何角度。我需要钳制这个输入角度,这样如果它在转弯半径之外,它将转到最近的有效角度 例如: 转弯半径:4° 原始角度=0° 输入角度=180.01° 输出角度=-4°或356°(实际输出应在[0360]范围内)当然) 或 转弯半径:4° 原始角度=0° 输入角度=179.99° 输出角度=4° 或 转弯半径:4° 原始角度=45° 输入角度=46° 输出角度=46°

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

例如:

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

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

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

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

首先,找出原始角度和输入角度之间的差异。(只需减去。) 然后,将此差值“规格化”到-180度和180度之间

normalized_difference = (((( raw_difference % 360) + 540) % 360) - 180)
然后,如果“规格化”差异超出所需范围,则将其更改为在范围内。然后将(可能更改的)规格化差异添加到原始角度以获得输出角度。如果希望将输出角度规格化为0度到359.99…度之间,则可以这样做:

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

基于@robert lozyniak的,这就是我的结局:

fn夹紧角度更新(角度:u8,目标:u8,限制:u8)->u8{
让mut差=目标为isize-角度为isize;
//使差异正常化
差值+=256+256/2;
差值%=256;
差值-=256/2;
设limit=极限为isize;
差异=如果差异>限制{
限制
}否则,如果差值<-极限{
-极限
}else{difference};
//将差异添加到原始角度
让mut angle=角度为isize+差值;
//使角度正常化
角度%=256;
角度+=256;
角度%=256;
角度为u8
}

您的示例和问题解释不清楚。尝试重新组织我同意MBo,绝对不清楚为什么179.99°转换为4°,180.01°转换为356°。在第三个示例中,为什么45°会发生变化?什么是转弯半径(当您将度设置为单位时,不清楚,因为半径是长度而不是角度)?也许你试图编码的图像会更有帮助…由于MBO的评论,不清楚你的夹紧规则是如何工作的…它们取决于以前的值还是新的值。为什么输入~180度值会夹紧到~0或~360,而不是~180(如果可以的话,你也会为原始角度
0
)?也许添加覆盖整个范围的绘图将向我们显示您无法作为text@kreaTTo“转弯半径”并不是你想象中的意思。这是用什么语言表达的?@RobertLozyniak