我在Tron Lightbike上。我想谈谈一点,但我只能做90度转弯。这可以防止这样的线形: 只有alows这样的行:
存储这些移动我有一个Queue
实现(FIFO),将移动存储为Integer
s。
UP: 0
RIGHT: 1
DOWN: 2
LEFT: 3
我有敌人的X和Y位置,我有X和Y位置。我想创建一条线,其中所有点都连接起来(没有对角线)从我到敌人,并将方向号存储在我的Queue
中。
生成此类线的方法是什么?
答案 0 :(得分:2)
我假设您想要这样的结果:
这可以通过从源细胞移动到靶细胞来实现,例如,一次向右和向下一个单元格,并根据从理想线到网格单元中心点的垂直距离确定每个步骤:
如果 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));