角度功能偶尔会返回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;

    }

有人可以帮我修复此代码

解决方法

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

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

https://dotnetfiddle.net/S3zwr5

您将必须编写一个if语句来处理这种情况。