2017-04-05 60 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