Vector3.SqrMagnitude似乎不准确

问题描述 投票:0回答:1

我有一个函数来返回NavMesh路径的总长度,使用Vector3.SqrMagnitude来避免Vector3.Distance中Sqrt计算的开销:

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个点或更多点,它总是返回一个较小的长线值,而不是只有2个点的短线。

第一张图片中显示的距离是3848,而第二张图片中的距离是3419,尽管它是一条更长的路径。

enter image description here enter image description here

Vector3.Distance可以正常使用任意数量的点。

我错过了什么吗?

c# unity3d unity5 vectormath
1个回答
1
投票

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)

© www.soinside.com 2019 - 2024. All rights reserved.