连接所有点的线算法,没有对角线

时间:2016-08-04 17:32:54

标签: java arrays algorithm matrix line

我在Tron Lightbike上。我想谈谈一点,但我只能做90度转弯。这可以防止这样的线形: Bresenham Line Algorithm 只有alows这样的行:

enter image description here

存储这些移动我有一个Queue实现(FIFO),将移动存储为Integer s。

UP:    0
RIGHT: 1
DOWN:  2
LEFT:  3

我有敌人的X和Y位置,我有X和Y位置。我想创建一条线,其中所有点都连接起来(没有对角线)从我到敌人,并将方向号存储在我的Queue中。

生成此类线的方法是什么?

1 个答案:

答案 0 :(得分:2)

我假设您想要这样的结果:

grid line

这可以通过从源细胞移动到靶细胞来实现,例如,一次向右和向下一个单元格,并根据从理想线到网格单元中心点的垂直距离确定每个步骤:

enter image description here

如果 x 是网格单元大小的一半, α 是理想的斜率然后,从中心点到理想线的阈值垂直距离为 x。(1 - tan(α)) 。如果距离小于此值,则水平移动,如果距离大于此值,则垂直移动。

您也可以这样看:如果理想线只穿过当前单元格的左右边缘,则水平移动;如果它通过当前单元格的顶部/底部边缘,则向上/向下移动。

如果理想线垂直于水平线(切线> 1),请使用类似的方法,但转动90°:测量从单元中心到理想线的水平距离,并垂直移动较小的距离,水平距离更远。

此JavaScript代码段使用余切显示主要水平线的算法,如示例中所示,以及主要垂直线的等效方法:

function tronPath(a, b) {
    var path = [a];
    var x = a.x, y = a.y;                         // starting cell
    var dx = a.x == b.x ? 0 : b.x > a.x ? 1 : -1; // right or left
    var dy = a.y == b.y ? 0 : b.y > a.y ? 1 : -1; // up or down
    if (dx == 0 || dy == 0) {
        // STRAIGHT LINE ...
    }
    else if (Math.abs(b.x - a.x) > Math.abs(b.y - a.y)) {
        // MAINLY HORIZONTAL
        var tan = (b.y - a.y) / (b.x - a.x);      // tangent
        var max = (1 - Math.abs(tan)) / 2;        // distance threshold
        while (x != b.x || y != b.y) {            // while target not reached
            var ideal = a.y + (x - a.x) * tan;    // y of ideal line at x
            if ((ideal - y) * dy >= max) y += dy; // move vertically
            else x += dx;                         // move horizontally
            path.push({x:x, y:y});                // add cell to path
        }
    }
    else {
        // MAINLY VERTICAL
        var cotan = (b.x - a.x) / (b.y - a.y);    // cotangent
        var max = (1 - Math.abs(cotan)) / 2;      // distance threshold
        while (x != b.x || y != b.y) {            // while target not reached
            var ideal = a.x + (y - a.y) * cotan;  // x of ideal line at y
            if ((ideal - x) * dx >= max) x += dx; // move horizontally
            else y += dy;                         // move vertically
            path.push({x:x, y:y});                // add cell to path
        }
    }
    return path;
}
var a = {x:1, y:1}, b = {x:11, y:5};
var path = tronPath(a, b);
document.write(JSON.stringify(path));