Php 使用X&;查找地图上相邻的六边形瓷砖;Y坐标

Php 使用X&;查找地图上相邻的六边形瓷砖;Y坐标,php,distance,hexagonal-tiles,Php,Distance,Hexagonal Tiles,我一直在努力解决这个问题,所以我真的必须寻求帮助 我创建了一个基于CSS的游戏地图,它以六边形瓷砖的形式覆盖DIV(就像桌面游戏一样)。我正在尝试查找与当前活动磁贴相邻的磁贴 我已经能够从左上角到右下角顺序生成地图的ID,并为每个瓷砖分配坐标。在此基础上,我使用毕达哥拉斯定理来计算两个X&Y坐标之间的距离(这花了我一段时间来计算)。事实上,情况非常接近,但问题是,因为十六进制瓷砖贴图基本上是“交错的”(例如,它不是正方形网格,两个相邻的瓷砖不在同一条精确的水平线上),当我计算距离时,一些实际上相

我一直在努力解决这个问题,所以我真的必须寻求帮助

我创建了一个基于CSS的游戏地图,它以六边形瓷砖的形式覆盖DIV(就像桌面游戏一样)。我正在尝试查找与当前活动磁贴相邻的磁贴

我已经能够从左上角到右下角顺序生成地图的ID,并为每个瓷砖分配坐标。在此基础上,我使用毕达哥拉斯定理来计算两个X&Y坐标之间的距离(这花了我一段时间来计算)。事实上,情况非常接近,但问题是,因为十六进制瓷砖贴图基本上是“交错的”(例如,它不是正方形网格,两个相邻的瓷砖不在同一条精确的水平线上),当我计算距离时,一些实际上相距两步的瓷砖,计算出来比相邻的瓷砖更接近

我已经展示了我构建的东西,所以你可以确切地看到我在说什么

如果您单击任何互动程序,它将刷新页面并在您的“当前位置”上放置一个标志。然后,每个平铺显示坐标和计算出的距当前位置的距离。如果单击周围,您将看到许多未与当前位置相邻的平铺距离较近

代码:
//加载映射DIV标记(90个分幅)
如果(isset($_GET['x'])){
$gl_map_x=$_GET['x'];
}否则$gl\u map\u x=0;
如果(isset($\u GET['y'])){
$gl_map_y=$_GET['y'];
}否则$gl\u map\u y=0;
if(isset($\u GET['mapid'])){
$gl_map_id=$_GET['mapid'];
}else$gl\U map\U id=42;
$i=1;
$x=0;
$y=0;
而(i 756元){
$x=63;
$y=$y+54;
}elseif($y==432){
$x=$x+63;
}
}
?>  

我知道我必须用一些额外的数学来补偿这些错乱的瓷砖,但我在这一点上已经超出了我的工资等级。但是这个功能对于我的小RPG游戏来说是必不可少的


有什么建议吗?

您可以在XY平面上使用欧几里德距离

两磅P1(x1,y1)和P2(x2,y2)之间的距离由下式给出:

sqrt( (y1-x1)^2 + (y2-x2)^2 )
如果您不关心实际距离,而只关心最近的点,则不应取平方根,而应仅使用:

(y1-x1)^2 + (y2-x2)^2

这是一个整数表达式(而不是浮点),因此速度更快、更准确。

你用了错误的方法,将电路板概念化为沿着页面运行的一系列列

{[0][0], NULL , [2][0]}
{ NULL ,[1][1],  NULL }
{[0][1], NULL , [2][1]}
{ NULL ,[1][2],  NULL }
{[0][2], NULL , [2][2]}
{ NULL ,[1][3],  NULL }
//The nulls are just to make it clearer feel free to optimize.
很明显,我们有一个由空填充的空间组成的二维数组来表示这个惊人的值,如果我们想让sapces与[0][2]相邻,我们就知道它们是


[0,1],[1,1],[2,1],[0,2],[2,2],[1,3]

没有草图就有点难以解释,但我认为解决方案相当简单。六边形的x坐标正常,但y坐标的一半需要校正。当我点击上面的链接时,标记的六边形的坐标是x=315,y=162。此列中所有单元格的y坐标需要增加27。因此,y坐标应为189,而不是162。对于正上方的单元格,y坐标。应该从108改为135。在该单元上方增加y坐标。从54岁到81岁,依此类推。每第二列都需要进行此更改,即所有六边形与我们刚才讨论的高度完全相同的列。如果进行此更改,毕达哥拉斯计算将允许您测试相邻单元格,因为它将生成六边形中心之间的距离。希望有帮助。祝你的比赛好运。

嗯。。。这是有道理的。让我试试看。我有一个forumla设置坐标,因为div是通过循环构建的。我不确定到底该如何修改它,使它为每一个其他垂直列增加27个y。我更新了问题以包含我的代码。您可以看到我在循环发生时如何进行坐标计算。我会尝试一些东西,但如果有什么想法,请发布。好的,我成功地编写了一些代码,每隔一列Y增加27。这有很大帮助,基本上使所有内部六边形都能正常工作。我仍然对外面的那个(在左上/左下/右上被切成两半)有意见。它似乎还可以计算从一侧到另一侧的缠绕距离;我可以接受这一点,但我的偏好是拥有它,这样你就不能在旅行时“环绕”地图了。我终于更新了页面!我解决了。正是这个答案(感谢@mata-n)为我指明了正确的方向。这更好,尽管我认为mata M上面的评论是正确的,因为我的Y坐标不正确,所以即使我换掉这个forumla,我仍然有同样的问题;一些非相邻的瓷砖似乎比一些相邻的瓷砖更接近。
{[0][0], NULL , [2][0]}
{ NULL ,[1][1],  NULL }
{[0][1], NULL , [2][1]}
{ NULL ,[1][2],  NULL }
{[0][2], NULL , [2][2]}
{ NULL ,[1][3],  NULL }
//The nulls are just to make it clearer feel free to optimize.