首页 > 解决方案 > 角度函数偶尔会返回 NaN

问题描述

我有这个角度函数用于 Unity 项目,但它偶尔会返回 NaN,我不明白为什么。我从互联网上复制了这段代码,所以我不完全理解它是如何工作的


    public static float Angle(Vector3 vec1, Vector3 angleVec, Vector3 vec2)
    {
        float lengthA = Mathf.Sqrt(Mathf.Pow(angleVec.x - vec1.x, 2) + Mathf.Pow(angleVec.y - vec1.y, 2));
        float lengthB = Mathf.Sqrt(Mathf.Pow(vec2.x - angleVec.x, 2) + Mathf.Pow(vec2.y - angleVec.y, 2));
        float lengthC = Mathf.Sqrt(Mathf.Pow(vec2.x - vec1.x, 2) + Mathf.Pow(vec2.y - vec1.y, 2));

        float calc = ((lengthA * lengthA) + (lengthB * lengthB) - (lengthC * lengthC)) / (2 * lengthA * lengthB);
        float returnAngle = Mathf.Acos(calc) * Mathf.Rad2Deg;
        if (System.Single.IsNaN(returnAngle))
        {
            Debug.LogError("NAN");
        }
        return returnAngle;

    }

有人可以帮我修复这段代码吗

标签: c#functionunity3dnanangle

解决方案


余弦函数的范围为 [-1, 1],因此反余弦函数的域为 [-1, 1]。这意味着对于 [-1, 1] 之外的任何 x,arccos(x) 是未定义的。

如果lengthAorlengthB为 0,calc则为无穷大acos(infinity)且未定义。

https://dotnetfiddle.net/S3zwr5

您将不得不写一个if声明来处理这种情况。


推荐阅读