2017-08-30 67 views
-1

例如,我有一個350度的角度,我想約束它的最大正偏移量爲30,最大負偏移量爲40.限制範圍內的浮動角度的快速方法是什麼?

因此,角度值應該是在(310,360)和(0,20)的範圍內。如果計算出的角度值爲304,則應將角度值約束爲310,並且如果計算出的角度值爲30,則應將角度值約束爲20.

我已經實施了一種方法,但效率不高足夠的(大部分努力是在角度值接近360〜0時解決問題)。什麼是快速實現這個目標的方法?

功能:

// All values are in the range [0.0f, 360.0f] 
// Output: the angle value after constraint. 

float _KeepAngleValueBetween(float originalAngle, float currentAngle, float MaxPositiveOffset, float MaxNegativeOffset). 

例如:

KeepAngleValueBetween(350.0f, 302.0f, 30.0f, 40.0f) 

結果:310.0f

KeepAngleValueBetween(350.0f, 40.0f, 30.0f, 40.0f) 

結果:20.0f

KeepAngleValueBetween(140.0f, 190.0f, 45.0f, 40.0f) 

結果:185.0f

+1

安置自己的嘗試。 –

+0

對不起,我不能。該代碼也用於我公司的一個項目中。 @KlasLindbäck –

+0

你仍然需要提供更多細節。輸入和預期輸出的數據類型和範圍。 –

回答

0

我無法想出一個不使用if的解決方案。無論如何,我通過在檢查​​是否在所需範圍內之前轉換值來處理0/360左右的問題。

僞代碼(好吧,這是C.它也是有效的Java和C++。):

float _KeepAngleValueBetween(float originalAngle, float currentAngle, float MaxPositiveOffset, float MaxNegativeOffset) { 

    // Translate so that the undesirable range starts at 0. 
    float translateBy = originalAngle + MaxPositiveOffset; 
    float result = currentAngle - translateBy + 720f; 
    result -= ((int)result/360) * 360; 

    float undesiredRange = 360f - MaxNegativeOffset - MaxPositiveOffset; 
    if (result >= undesiredRange) { 
     // No adjustment needed 
     return currentAngle; 
    } 

    // Perform adjustment 
    if (result * 2 < undesiredRange) { 
     // Return the upper limit because it is closer. 
     result = currentAngle + MaxPositiveOffset; 
    } else { 
     // Return the lower limit 
     result = currentAngle - MaxNegativeOffset + 360f; 
    } 

    // Translate to the range 0-360. 
    result -= ((int)result)/360 * 360; 

    return result; 
} 
相關問題