c# - 角度函数偶尔会返回 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) 是未定义的。
如果lengthA
orlengthB
为 0,calc
则为无穷大acos(infinity)
且未定义。
https://dotnetfiddle.net/S3zwr5
您将不得不写一个if
声明来处理这种情况。
推荐阅读
- featuretools - 并行化特征工具 dfs
- arrays - Excel 365 函数计算原始列表中数组列表的出现次数
- api - ERC20 输入 HEX API 解码
- antd - 如何让卡片填满 Ant Design 中 Grid Row 的整个高度?
- java - 在java中输入一年并计算它的天数,包括闰年
- javascript - 如何在 Bootstrap 的 textarea 中设置灵活的行数?
- java - “com.org.gradle.API”中的 BaseVariant 在 java 中已弃用。它有什么替代品?
- python - 匹配关闭的单词列表
- java - 运行 .JAR 文件的 Maven 声称缺少依赖项
- c# - 带有 .NET 5 和 EF Core 的 HierarchyID 引发转换错误