2012-07-05 25 views
1

我正在嘗試編寫一個函數,告訴我角度是否位於其他兩個角度內。如果說'如果一個角度在2個其他角度'我的意思是例如,如果我有2角度0和90那麼45將介於這些角度之間,但-20(或99)不會。角度命中比較:無法檢測命中

我的問題:我的功能似乎並沒有檢測到當兩個角度在2個角度之內時它應該。我不確定我的功能是否適用於負面角度?

我需要改變以使我的功能正常工作?

bool is_angle_between(int target, int angle1, int angle2) 
{ 
    // Post: Return true if target lies between the 2 angles 

    int iTarget = (360 + (target % 360)) % 360; 
    int iAngle1 = (3600000 + angle1) % 360; 
    int iAngle2 = (3600000 + angle2) % 360; 

    if (iAngle1 < iAngle2) 
    if (iAngle1 <= iTarget && iTarget <= iAngle2) 
     return true; 
    else if (iAngle1 <= iTarget || iTarget <= iAngle2) 
    return true; 

    return false; 
} 
+1

'target> angle1 && target Marlon

+0

@StackUnderflow將工作,如果angle1是更大的角度?變量angle1和angle2不按其大小排序,它們可以是任何值。不確定這將適用於is_angle_between(45,90,0);? –

回答

-1

看起來這應該工作:

if (iAngle1 < iAngle2) { 
    if (iAngle1 <= iTarget && iTarget <= iAngle2) { 
     return true; 
    } 
} 
else { 
    if (iAngle2 <= iTarget && iTarget <= iAngle1) { 
     return true; 
    } 
} 

return false; 

注意括號這裏幫助確保其他人相匹配的,如果你想讓它。您的原始代碼按照您希望的匹配縮進,但這不是它被解析的方式。

1

這個問題只與測試一個整數是否在兩個其他整數範圍內有關。因爲我們不知道angle1angle2是否是更大的價值,我會做這樣的事情:

bool is_angle_between(int target, int angle1, int angle2) 
{ 
    return (target > angle1 && target < angle2) || 
      (target > angle2 && target < angle1); 
} 
+0

Downvoter謹慎解釋? – Marlon

+0

答案是錯的,順序很重要,因爲角度是圓形的。 – starblue

1

做一個很好的辦法就是讓你比較數字是積極的旋轉間隔:

int rTarget = ((target - angle1) % 360 + 360) % 360; 
int rAngle2 = ((angle2 - angle1) % 360 + 360) % 360; 
return 0 <= rAngle1 && rAngle1 <= rAngle2; 

否則你會在0 = 360度附近遇到麻煩。

順便說一句,你應該避免不必要的if陳述,因爲分支可能很昂貴。