查找点的图块索引 - 在划分为图块的无限 2D 平面上



我试图将我的游戏世界划分为扇区/图块。并根据玩家/对象位置识别玩家/对象所在的磁贴。 我没有有限的世界大小,所以世界可以是任何大小。磁贴大小已定义且恒定。因此,整个世界被划分为给定维度的方形瓷砖。

示例:如果我将我的世界划分为大小相等的方形瓷砖,例如 300x300。

  • 如果玩家在位置 (0,0( 到 (300,300( 内,则图块编号应为 (0,0(
  • 如果玩家在位置 (0,0( 到 (300,-300( 内,则图块编号应为 (0,-1(
  • 如果玩家在位置 (-300,0( 到 (-600,300( 内,则图块编号应为 (-2,-0(

更多示例输入和输出:

    玩家位置为(10,10
  • (,图块编号应为(0,0(

  • 玩家位置为 (-
  • 10,10(,图块编号应为 (-1,0(

  • 玩家位置为 (10,-
  • 10(,图块编号应为 (0,-1(

  • 玩家位置为 (-10,-
  • 10(,图块编号应为 (-1,-1(

  • 玩家位置为(1,1(,图块编号应为(0,0(

  • 玩家位置为 (1,-1
  • (,磁贴编号应为 (0,-1(

  • 玩家位置为 (-1,1
  • (,图块编号应为 (-1,0(

  • 玩家位置为 (-1,-1
  • (,图块编号应为 (-1,-1(

  • 玩家位置为 (-
  • 450,100(,图块编号应为 (-2,0(

  • 玩家位置为(450,100(,牌号应为(1,0(

  • 玩家位置为(-
  • 450,-100(,图块数应为(-2,-1(

  • 玩家位置为(450,-100(,牌号应为(1,-1(

我有下面的代码,它似乎只有在 X/Z 为正时才能正常工作。一旦它处于 X/Z 的负侧,我不确定如何计算头寸。

public static Sector GetCurrentSector(Vector3 p_position)
{
int x = Mathf.FloorToInt(p_position.x / cellSize);
int z = Mathf.FloorToInt(p_position.z / cellSize);
return new Sector(x, z);
}

我检查了以下问题,这些问题似乎与我的问题有关:

  • 将 2D 数组划分为框 - 具有与我的完全相同的缺陷
  • 获取 2D 地图图块的矩形坐标 - 与我的问题完全相同
  • 如何使用划分为图块的平面对象创建 3D 图块地图? - 似乎不是同一个问题
  • 将2d游戏世界坐标转换为屏幕位置-似乎不是相同的问题
  • 从世界坐标转换为切片位置 - 似乎是一个不同的问题

注意:我也不确定这个问题叫什么!所以,这让我很难搜索。我的搜索将我带到了与圆、半径、圆内点等相关的多个地方,

我建议您使用 int 而不是 FloorToInt 并使用整数除法:

public static Sector GetCurrentSector(Vector3 p_position)
{
int x = (int)p_position.x / (int)cellSize;
int z = (int)p_position.z / (int)cellSize;
return new Sector(x, z);
}

我的答案不正确,您的方法正确使用MATF。FloorInt 比负数的整数除法更好。

最新更新