经过更多阅读,我发现我链接的文章实际上已经解决了这个问题,虽然有些隐藏,所以这里有一个更“直截了当”的答案。
(尽管如此,Terje D. 的回答很好,我只是发布这个,因为我觉得它比他的回答的“魔法”更容易理解)
在Red Blob Games 的文章中,他实际上描述了计算两个给定十六进制之间距离的公式:
function hex_distance(Hex(q1, r1), Hex(q2, r2)) {
return (abs(q1 - q2) + abs(r1 - r2)
+ abs(q1 + r1 - q2 - r2)) / 2;
}
我把它翻译成 MySQL 中的一个函数
CREATE FUNCTION `rangeBetweenTiles`(tile1q int, tile1r int, tile2q int, tile2r int) RETURNS int(11)
DETERMINISTIC
BEGIN
RETURN (abs(tile1q - tile2q) + abs(tile1r - tile2r)
+ abs(tile1q + tile1r - tile2q - tile2r)) / 2;
END
并在另一个函数中使用它:
CREATE FUNCTION `isInRange`(tile1q int, tile1r int, tile2q int, tile2r int, `range` Int) RETURNS tinyint(1)
DETERMINISTIC
BEGIN
RETURN rangeBetweenTiles(tile1q, tile1r, tile2q, tile2r) <= `range`;
END
然后可以很容易地在 select 语句中使用它:
select *
from tiles
where isInRange(:tile_q, :tile_r, positionQ, positionR, :n)
它适用于任何:n