Vector3.SqrMagnitude 似乎不准确
Vector3.SqrMagnitude seems inaccurate
我有一个函数 return NavMesh 路径的总长度,使用 Vector3.SqrMagnitude to avoid the overhead of the Sqrt calculation in Vector3.Distance:
float DistanceAlongPath(NavMeshPath path)
{
float sum = 0;
for (int x = 0; x < path.corners.Length - 1; x++)
{
sum += Vector3.SqrMagnitude(path.corners[x + 1] - path.corners[x]);
}
return sum;
}
当路径只有两个点时,计算似乎很好,但是在 3 个点或更多点时,对于长线,它总是 return 比只有 2 个点的短线的值更小。
第一张图片中显示的距离是 3848,第二张图片中显示的距离是 3419,尽管路径要长得多。
Vector3.Distance 适用于任意数量的点。
我是不是漏掉了什么?
SqrMagnitude 仅给出长度的近似值。虽然 SqrMagnitude 的值可以 相互比较 以进行相对长度比较,但它们不会给出真实长度,因此您不能将它们组合起来。
这里问题的根源在于数学,特别是加法和乘法的处理顺序:
(5+5+5)^2 != (5^2 + 5^2 + 5^2)
例如,如果您有 3 条线段,每条线段的长度为 5,则每条线段的 SqrMagnitude 为 25。将它们相加得到 115。
现在考虑长度为 15 的单个线段。SqrMagnitude 为 225。
在任何一种情况下,如果应用平方根运算来获得真实长度,都会得到相同的结果。 3*Sqrt(25) == 1*Sqrt(225)
我有一个函数 return NavMesh 路径的总长度,使用 Vector3.SqrMagnitude to avoid the overhead of the Sqrt calculation in Vector3.Distance:
float DistanceAlongPath(NavMeshPath path)
{
float sum = 0;
for (int x = 0; x < path.corners.Length - 1; x++)
{
sum += Vector3.SqrMagnitude(path.corners[x + 1] - path.corners[x]);
}
return sum;
}
当路径只有两个点时,计算似乎很好,但是在 3 个点或更多点时,对于长线,它总是 return 比只有 2 个点的短线的值更小。
第一张图片中显示的距离是 3848,第二张图片中显示的距离是 3419,尽管路径要长得多。
Vector3.Distance 适用于任意数量的点。
我是不是漏掉了什么?
SqrMagnitude 仅给出长度的近似值。虽然 SqrMagnitude 的值可以 相互比较 以进行相对长度比较,但它们不会给出真实长度,因此您不能将它们组合起来。
这里问题的根源在于数学,特别是加法和乘法的处理顺序:
(5+5+5)^2 != (5^2 + 5^2 + 5^2)
例如,如果您有 3 条线段,每条线段的长度为 5,则每条线段的 SqrMagnitude 为 25。将它们相加得到 115。
现在考虑长度为 15 的单个线段。SqrMagnitude 为 225。
在任何一种情况下,如果应用平方根运算来获得真实长度,都会得到相同的结果。 3*Sqrt(25) == 1*Sqrt(225)