Javascript 在六边形网格中寻找最短路径

Javascript 在六边形网格中寻找最短路径,javascript,html,Javascript,Html,我有一个用六边形填充的网格,我想计算从点a到点B的所有方向的最短路径 我正在使用我的修改版。到目前为止,它似乎只在水平或垂直线上选择两个点时起作用。任何其他方向都不行 这就是我想要实现的 这些方法负责计算网格上任意两点之间的路径: hex_round: function(h){ var q = Math.trunc(Math.round(h.q)); var r = Math.trunc(Math.round(h.r)); var s = Math.trunc(Math.

我有一个用六边形填充的网格,我想计算从点a点B的所有方向的最短路径

我正在使用我的修改版。到目前为止,它似乎只在水平或垂直线上选择两个点时起作用。任何其他方向都不行

这就是我想要实现的

这些方法负责计算网格上任意两点之间的路径:

hex_round: function(h){
    var q = Math.trunc(Math.round(h.q));
    var r = Math.trunc(Math.round(h.r));
    var s = Math.trunc(Math.round(h.s));

    var q_diff = Math.abs(q - h.q);
    var r_diff = Math.abs(r - h.r);
    var s_diff = Math.abs(s - h.s);

    if (q_diff > r_diff && q_diff > s_diff){
        q = -r - s;
    }else if (r_diff > s_diff){
        r = -q - s;
    }else{
        s = -q - r;
    }

    return {q:q, r:r, s:s};
},
getHexDistance: function(a, b){
    var deltaX = a.pathCoordX - b.pathCoordX,
    deltaY = a.pathCoordY - b.pathCoordY;
    return ((Math.abs(deltaX) + Math.abs(deltaY) + Math.abs(deltaX - deltaY)) / 2);
},
hex_lerp: function(a, b, t){
    return { 
        q : (a.pathCoordX + (b.pathCoordX - a.pathCoordX) * t ) ,  
        r: (a.pathCoordY + (b.pathCoordY - a.pathCoordY) * t ), 
        s: (a.size.s + (b.size.s - a.size.s) * t)
    }
},
getHexDistance: function(a, b){
    var deltaX = a.pathCoordX - b.pathCoordX,
    deltaY = a.pathCoordY - b.pathCoordY;
    return ((Math.abs(deltaX) + Math.abs(deltaY) + Math.abs(deltaX - deltaY)) / 2);
},
calculatePath: function( h1, h2 ){/* (hexagon, hexagon)*/
    var N = this.getHexDistance(h1, h2)
    var results = [];
    var step = 1.0 / Math.max(N, 1);
    for( var i = 0; i <= N; i++ ){
        results.push( this.hex_round( this.hex_lerp(h1, h2, step * i) ) );
    }

    return results;
},
hex_-round:函数(h){
var q=数学特鲁克(数学四舍五入(h.q));
var r=数学特鲁克(数学四舍五入(h.r));
var s=数学特鲁克(数学四舍五入(h.s));
var q_diff=数学绝对值(q-h.q);
var r_diff=数学绝对值(r-h.r);
var s_diff=数学绝对值(s-h.s);
if(q_diff>r_diff&&q_diff>s_diff){
q=-r-s;
}else if(r_diff>s_diff){
r=-q-s;
}否则{
s=-q-r;
}
返回{q:q,r:r,s:s};
},
getHexDistance:函数(a,b){
var deltaX=a.pathCoordX-b.pathCoordX,
deltaY=a.pathCoordY-b.pathCoordY;
返回((Math.abs(deltaX)+Math.abs(deltaY)+Math.abs(deltaX-deltaY))/2);
},
十六进制:函数(a、b、t){
返回{
q:(a.pathCoordX+(b.pathCoordX-a.pathCoordX)*t),
r:(a.pathCoordY+(b.pathCoordY-a.pathCoordY)*t),
s:(a.size.s+(b.size.s-a.size.s)*t)
}
},
getHexDistance:函数(a,b){
var deltaX=a.pathCoordX-b.pathCoordX,
deltaY=a.pathCoordY-b.pathCoordY;
返回((Math.abs(deltaX)+Math.abs(deltaY)+Math.abs(deltaX-deltaY))/2);
},
calculatePath:函数(h1,h2){/*(六边形,六边形)*/
var N=此.getHexDistance(h1,h2)
var结果=[];
var阶跃=1.0/数学最大值(N,1);

对于(var i=0;i这是一个已解决的问题,有很多文献支持它。我知道的最好的资源是关于红点游戏:

简而言之,最可能的原因是您选择了错误的坐标系。使用立方体坐标系,解决方案很简单,只需一行代码:

function cube_distance(a, b):
return (abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z)) / 2
。如果您确实想使用其他系统,请在需要时进行转换