2017-02-15 87 views
4

我需要一個將角度(以度數爲單位)限制在任意範圍[min,max]的功能。以下是一些示例: Angle range examples將夾角限制在任意範圍

彩色區域表示有效的角度範圍。

  • 在圖像#1,應鉗位到最大(-90)
  • 在圖像#2,ANG應鉗位到分鐘(135)
  • 在圖像#3,ANG應鉗位到分鐘(135)

這是我到目前爲止有:

static float clamp_angle(float ang,float min,float max) 
{ 
    ang = normalize_angle(ang); // normalize_angle transforms angle into [-180,180) range 
    min = normalize_angle(min); 
    max = normalize_angle(max); 
    if(angle_in_range(ang,min,max) == false) 
    { 
     if(abs(get_angle_difference(ang,min)) < abs(get_angle_difference(ang,max)) 
      ang = min; // Clamp to min if we're closer to min than max 
     else 
      ang = max; 
    } 
    return ang; 
} 

什麼,我缺少的是功能angle_in_rangetrue如果角度的範圍內,否則false)。
確定角度是否在範圍內的最簡單方法是什麼?

+0

這聽起來類似於http://stackoverflow.com/questions/13652518/efficiently-find-points-圈內圈?至少數學要求。 – Zze

回答

2

您可以按照ang變爲0並且min和max映射到[-180; 180)。然後,你可以檢查是否角是在提供的範圍是這樣的:

float clamp_angle(const float ang, const float min, const float max) 
{ 
    float n_min = normalize180(min-ang); 
    float n_max = normalize180(max-ang); 

    if (n_min <= 0 && n_max >= 0) 
    { 
     return ang; 
    } 
    if (abs(n_min) < abs(n_max)) 
     return min; 
    return max; 
} 

Live On Coliru

0

假設您使用順時針順序。 cw順序的最小值和最大值之間的距離是dist(min,max)=(max - min)mod N 假設點在區域內。然後dist(min,A)+ dist(A,max)= dist(min,max)。現在您可以測量A點,min點和max點之間的距離:dist(min,A)=(A - min)mod N dist(A,max)=(max-A)modN。如果一個外部區域,那麼距離的總和應該是N + dist(min,max),如果它內部應該相等dist(min,max)

在你的情況N = 360,所有值都在[0,360 )

編輯:在大多數語言中,(-x)modX的行爲是未定義的,所以您應該手動將-x轉換爲正數,例如(-x + X)modX其中x位於[0,X)