问题描述
我有一个用于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)是未定义的。
如果lengthA
或lengthB
为0,则calc
为无穷大,而acos(infinity)
未定义。
https://dotnetfiddle.net/S3zwr5
您将必须编写一个if
语句来处理这种情况。