夹紧角度任意范围

Sil*_*lan 5 c++ angle range

我需要一个函数将角度(以度为单位)限制在任意范围内[min,max]。这里有些例子: 角度范围示例

彩色区域代表有效角度范围。

  • 在图像 #1 中,ang应限制为最大值(-90)
  • 在图像 #2 中,ang应被限制为min (135)
  • 在图像 #3 中,ang应被限制为min (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;
}
Run Code Online (Sandbox Code Playgroud)

我缺少的是函数angle_in_rangetrue如果角度在范围内,否则false)。
确定角度是否在范围内的最简单方法是什么?

Ser*_*kov 4

您可以以这样的方式标准化角度,使 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;
}
Run Code Online (Sandbox Code Playgroud)

Live On Coliru