过去1.5小时我一直在努力编写一个函数来计算manhattan distance的方格toroid(就像玩无墙的经典蛇游戏一样)。
我拥有(用JavaScript编码)
function getManhattanDistance( node1, node2, size )
{
size = parseInt( size / 2 );
var dist1 = Math.abs( node1.x - node2.x );
var dist2 = Math.abs( node1.y - node2.y );
if ( dist1 < size && dist2 < size )
{
return dist1 + dist2;
}
if ( dist1 >= size )
{
var x1 = Math.min( node1.x, node2.x );
var x2 = Math.max( node1.x, node2.x );
x1 += size;
if ( dist2 < size )
{
return Math.abs( x1 - x2 ) + dist2;
}
var y1 = Math.min( node1.y, node2.y );
var y2 = Math.max( node1.y, node2.y );
y1 += size;
return Math.abs( x1 - x2 ) + Math.abs( y1 - y2 );
}
var y1 = Math.min( node1.y, node2.y );
var y2 = Math.max( node1.y, node2.y );
y1 += size;
return dist1 + Math.abs( y1 - y2 );
}
我在5 * 5环形线上写了一些测试:
差距距离0,1; 2,2是1应该是3 差距距离为2,2; 0,1是1应该是3 差距距离2,1; 3,4是2应该是2 距离3,4; 2,1是2应该是2 差距距离2,1; 4,4是1应该是5 差距距离为4,4; 2,1是1应该是5
谢谢你们,伙计们!
答案 0 :(得分:2)
如果我理解你的问题,你可以直接从x1到x2(abs(x1 - x2)
步骤)在x方向上“行走”,或者在增加x方向(size + x2 - x1
步骤)中环绕或减少x方向(x1 - x2 + size
步)。
因此,x方向的差异是
dx = min ( abs(x1 - x2) , size + x2 - x1, x1 - x2 + size)
和类似的
dy = min ( abs(y1 - y2) , size + y2 - y1, y1 - y2 + size)
最后是曼哈顿距离
dist = dx + dy
更新:另一种看待它的方法是x方向的距离是
如果你没有环绕,可以是abs(x2-x1)
;如果你环绕,可以是size - abs(x2-x1)
。
因此
dx = min ( abs(x2 - x1) , size - abs(x2 - x1) )
这是表达它的一种更对称的方式。
更新:最终的JavaScript函数:
function getToroidManhattanDistance( node1, node2, size )
{
var dx = Math.min( Math.abs( node1.x - node2.x ), size - Math.abs( node2.x - node1.x ) );
var dy = Math.min( Math.abs( node1.y - node2.y ), size - Math.abs( node2.y - node1.y ) );
return dx + dy;
}