一个硬写的旋转约束问题解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个硬写的旋转约束问题解决相关的知识,希望对你有一定的参考价值。

 

最近遇到一个相机旋转约束问题

技术分享

 

本来想直接比较欧拉值解决,但是欧拉角的值是0-360的区间,比如当前角度是1,范围是350-10,就会出错。需要做环形范围的判断

当然也可以转换成向量来比较,但那样计算太昂贵了

 

也就是说需要写一个环形区间的clamp,类似下面这张图

技术分享

 

 

数学不好,直接硬写:

技术分享
public static float AngleClamp(float min, float max, float value)
{
    if (min > max && (value < max || value > min))
    {
        return value;
    }

    if (value > min && value < max)
    {
        return value;
    }

    value = value == 0 ? 360 : value;
    min = min == 0 ? 360 : min;
    max = max == 0 ? 360 : max;

    var a1 = 360 - value + min;
    var b1 = Math.Abs(min - value);
    var c1 = a1 < b1 ? a1 : b1;

    var a2 = 360 - value + max;
    var b2 = Math.Abs(max - value);
    var c2 = a2 < b2 ? a2 : b2;

    if (c1 < c2)
    {
        if (value < min || value > max)
        {
            return min;
        }
    }
    else
    {
        return max;
    }

    return float.NaN;
}
AngleClamp

 

测试用例:

技术分享

 

类似的问题有很多,但大多可以直接写死数值判断

以上是关于一个硬写的旋转约束问题解决的主要内容,如果未能解决你的问题,请参考以下文章

使用 ActionBar 旋转 Android 的双片段

处理屏幕旋转上的片段重复(带有示例代码)

Butterknife 片段旋转给出 NullPointer

旋转后不采用 Swift 约束

无法同时满足约束 - LayoutConstraints

如何在没有活动旋转的情况下旋转活动内的片段?