Algorithm 在等距六边形平铺引擎中将屏幕转换为地图坐标?

Algorithm 在等距六边形平铺引擎中将屏幕转换为地图坐标?,algorithm,math,Algorithm,Math,我正在开发一款使用六边形网格的TBS游戏。但是,我希望它是等轴测的(看起来不错,像素艺术),并且平铺引擎工作良好,结果如下: 然而,为了实现这一点,我不得不修改值(瓷砖大小、瓷砖算法)以使瓷砖正确匹配。 下面是一个示例互动程序: 瓷砖尺寸为62x32,平铺时,每个瓷砖在x轴上移动47(cw),在y轴上移动16(ch)以正确安装 这是我如何从地图坐标计算屏幕坐标(用于绘制分幅): function toScreen(x, y, z, offset) { offset = ifndef(

我正在开发一款使用六边形网格的TBS游戏。但是,我希望它是等轴测的(看起来不错,像素艺术),并且平铺引擎工作良好,结果如下:

然而,为了实现这一点,我不得不修改值(瓷砖大小、瓷砖算法)以使瓷砖正确匹配。 下面是一个示例互动程序:

瓷砖尺寸为62x32,平铺时,每个瓷砖在x轴上移动47(cw),在y轴上移动16(ch)以正确安装

这是我如何从地图坐标计算屏幕坐标(用于绘制分幅):

function toScreen(x, y, z, offset)
{
    offset = ifndef(offset, {x: 0, y: 0});
    var ret = new Vector2D(y*Tile.cw + x*Tile.cw -offset.x, -x*Tile.ch + y*Tile.ch -offset.y -z*16);
    ret.y += (Tile.height*this.h)/2; //center the map on screen
    return ret;
}
现在,我需要能够选择瓷砖,并从屏幕(鼠标)坐标中获取地图坐标。我不知道是否有可能只是变换坐标(我所有的尝试都失败了)

这是地图坐标系的外观以及平铺的绘制方式:

当然,瓷砖的选择必须是像素完美的,但只针对平面瓷砖(不需要选择在上面瓷砖上的树),因此算法可以假设所有瓷砖都是平面的(就像我给出的示例)。有人对如何做到这一点有什么想法吗?我可以通过将[0,0]处的图块转换为屏幕空间,并查看指针是否在其中,或者它有多远,然后一块一块地慢慢移动,直到找到一个包含鼠标坐标的图块(或者没有包含鼠标坐标的图块),来“蛮力”它,但如果存在的话,我正在寻找一个更优雅的解决方案

有人有什么想法吗


谢谢。

请阅读这篇文章,深入了解六角形网格:


有一节介绍如何将直角坐标转换为六角形坐标。通过添加一个额外的仿射变换,将六边形转换为规则六边形,您可以很容易地将他的方法适应您的“等距六边形平铺”。

+1对于结构良好的问题。我正在寻找类似的方法,但找不到它。这有点含糊,但解释得很好。非常感谢:)