所以我有一个具有 100x100 网格的十六进制网格...网格是递归的,因此当您向左滚动经过“0,0”位置时,它会绘制“99,0”行等...我的问题是找到一种算法可以让我计算是否要循环...
示例: 96 - 97 - 98 - 99 - 0 - 1 - 2 - 3 - 4
这两个位置的起始位置都小于结束位置 如果我在第 2 行并且屏幕平移到第 98 行:
2 到 98 作品 (98) - 100 = -2 那么 -2-(2) = 4 的距离
96 到 98 失败 (98) - 100 = -2 那么 -2-(96) = 98 的距离(正确的是 2)
两者的结束位置都小于起始位置 然而,这并不适用于两个方向......所以我们这样做...... 从第 98 行到第 2 行:
98 到 2 作品 (2) + 100 = 102 那么 102-(98) = 距离 4
96 到 98 失败 (96) + 100 = 196 那么 196-(98) = 98 的距离(正确的是 2)
正如你所看到的,我不能只说开始<结束或开始>结束,因为数字循环将其拧紧。我需要以某种方式检测何时“越线”...
<小时/>经过乔纳森的建议,我意识到客户端显示和幕后不必排队。我已经更改了引擎,因此有 2 个十六进制值...其中一个是实际位置,例如 98,2 0,0 2,1。另一个是从视口(viewport)开始的字面位置。
看起来像这样:
Actual: 96 97 98 99 00 01 02 03 04 <= display in client & reference hexGridModel
Literal: -4 -3 -2 -1 00 01 02 03 04 <= use to calculate buffer position updates from camera
字面意思只是从“显示”的 Angular 来看。稍后我需要进行修复,看看我们是否通过了 -100 或 +100,但这暂时解决了问题,并且 map 大小是动态的,因此需要稍后进行处理
现在我只是将它用于任何情况。
var x, y = 0
x = this.buffer.coords.current.x - this.buffer.coords.last.x;
y = this.buffer.coords.current.y - this.buffer.coords.last.y;
最佳答案
我想说,如果没有您提供给我们的更多信息,这实际上是不可能的。以从 2 移动到 98 为例。您将无法判断用户是从 2 -> 1 -> 0 -> 99 -> 98
还是 2 -> 3 -> 4 -> ... -> 97 -> 98
。
因此,能够确定这一点的关键是了解玩家或物体移动的方向。
如果你知道这一点,你可以说(假设 0 位于网格的左边界,99 位于网格的右边界):
if ((direction == LEFT && new_pos > old_pos) || (direction == RIGHT && new_pos < old_pos) {
// The "line" has been crossed.
} else {
// The "line" was not crossed.
}
如果您还需要知道行驶的距离,可以这样分解:
GRID_SIZE = 100
if (direction == LEFT && new_pos > old_pos) {
distance = (GRID_SIZE - new_pos) + old_pos;
} else if (direction == RIGHT && new_pos < old_pos) {
distance = (GRID_SIZE - old_pos) + new_pos;
} else {
distance = abs(new_pos - old_pos)
}
关于javascript - 计算数字字符串是否循环 |六 Angular 网格圆形世界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8075230/