如何在三维网格上计算对角线距离



我正在尝试将Sebastian Lague的A-Star路径查找代码(youtube(调整为三维。我有点工作,但偶尔我的节点之间产生的路径是次优的,我认为这是因为我计算的距离错误。

沿着单个维度从一个节点移动到下一个节点的距离为1。要在二维(对角(中移动,距离为√2(在代码中简化为1.4(。将这些值乘以10以保持它们为整数,因此分别为10和14。

要计算二维平面上的距离,可以取X和Y距离中较小的一个,将其乘以14,然后从较大的距离减去较小的距离,将剩余的距离乘以10。

int dstX = Mathf.Abs(nodeA.gridX - nodeB.gridX);
int dstY = Mathf.Abs(nodeA.gridY - nodeB.gridY);
if (dstX > dstY)
{
return 14 * dstY + 10 * (dstX - dstY);
}
else
return 14 * dstX + 10 * (dstY - dstX);

三维移动仍然是对角线移动,因此距离应该仍然是14。因此,向前向左移动一个节点并不比向上移动、向前向左移动更远。所以我不是取最小值乘以14,而是取中间值乘以14。然后我从最大值中减去中间值,并将余数乘以10。

如果X最大,Y在中间,Z最小,那么每当我需要对角移动以接近Y值时,我也可以同时向Z值移动,所以我甚至不需要考虑Z轴上的距离。

int xDistance = Mathf.Abs(nodeA.gridX - nodeB.gridX);
int yDistance = Mathf.Abs(nodeA.gridY - nodeB.gridY);
int zDistance = Mathf.Abs(nodeA.gridZ - nodeB.gridZ);
int largest = Mathf.Max(xDistance, yDistance, zDistance);
int middle = GetMiddleValue(xDistance, yDistance, zDistance);
int smallest = Mathf.Min(xDistance, yDistance, zDistance);
return 14 * middle + 10 * (largest - middle);

出于某种原因,我的路径仍然有扭结,就像它会在向上移动之前向下移动一个节点。白线显示了2个白色立方体之间的最佳路径,而黑色跟随路径实际采用的节点。

也许这是一个舍入问题,但我不太相信在计算距离时我没有错过任何东西。

我只写了4-5个月的代码,所以如果这真的很明显,我很抱歉。如有任何帮助,我们将不胜感激。

在您的代码中,在二维中更改位置应该基于14(2的10*平方根(,但如果我的快速数学正确的话,同时更改所有三维应该基于17(3的10*方根(。我怀疑这可能会解决你的问题。

(果不其然……这里有一个简短的解释,解释为什么它应该基于sqrt(3(。(

正如Beska所说,在3D空间的某些情况下,它应该是根(3(,但为什么?勾股定理也适用于3D,其中距离=根(a²+b²+c²(

在你的3D空间中,如果你只朝一个方向移动,你会有一个根的距离(1²+0²+0㎡(,即1

如果你向两个方向移动,你会得到一个根(1²+1²+0²(,它是根(2(

但如果你同时向这三个方向移动,你最终会得到根(1²+1²+1²(,这就是根(3(

希望我明白了:(

最新更新