曼哈顿距离为2d环形

时间:2014-05-10 10:48:25

标签: javascript c math distance

过去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

谢谢你们,伙计们!

1 个答案:

答案 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;    
}