Javascript 二维圆环体的曼哈顿距离

Javascript 二维圆环体的曼哈顿距离,javascript,c,math,distance,Javascript,C,Math,Distance,在过去的1.5个小时里,我一直在努力编写一个计算正方形的函数(就像玩经典的无墙蛇游戏) 我拥有的(用JavaScript编码) 函数getManhattainstance(节点1、节点2、大小) { size=parseInt(size/2); var dist1=Math.abs(node1.x-node2.x); var dist2=Math.abs(node1.y-node2.y); if(距离1(2,4)->(3,4)的距离是3。还是我误解了问题?不,你是对的。正在查看错误的节点。谢谢您

在过去的1.5个小时里,我一直在努力编写一个计算正方形的函数(就像玩经典的无墙蛇游戏)

我拥有的(用JavaScript编码)

函数getManhattainstance(节点1、节点2、大小)
{
size=parseInt(size/2);
var dist1=Math.abs(node1.x-node2.x);
var dist2=Math.abs(node1.y-node2.y);
if(距离1<尺寸和距离2<尺寸)
{
返回dist1+dist2;
}
如果(dist1>=大小)
{
var x1=数学最小值(节点1.x,节点2.x);
var x2=数学最大值(节点1.x,节点2.x);
x1+=尺寸;
如果(距离2<大小)
{
返回数学abs(x1-x2)+dist2;
}
变量y1=数学最小值(节点1.y,节点2.y);
变量y2=数学最大值(节点1.y,节点2.y);
y1+=尺寸;
返回数学abs(x1-x2)+数学abs(y1-y2);
}
变量y1=数学最小值(节点1.y,节点2.y);
变量y2=数学最大值(节点1.y,节点2.y);
y1+=尺寸;
返回距离1+数学绝对值(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


谢谢大家

如果我正确理解您的问题,您可以在x方向上直接从x1走到x2(
abs(x1-x2)
steps),或者在增加x方向上缠绕(
size+x2-x1
steps),或者在减少x方向上缠绕(
x1-x2+size
steps)

因此,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;    
}

Ofc。事实并非如此,但对于许多人工智能模拟器来说,这是一个有价值的东西,可以节省时间,而且在SO数据库中仍然缺失。但是谢谢你的意见。@IgorLacik:(2,1)到(3,4)的距离不应该是3吗?从(2,1)到(4,4)的距离应该是4?@Martin R:2,1到3,4应该是2,但是是的,2,1到4,4应该是4。谢谢。@IgorLacik:(2,1)->(2,0)->(2,4)->(3,4)的距离是3。还是我误解了问题?不,你是对的。正在查看错误的节点。谢谢您的帮助。。终于明白了
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;    
}