[[已解决]在划分为图块的无限二维平面上查找点的图块索引

问题描述 投票:0回答:1

我试图将我的游戏世界划分为部门/区块。并根据播放器/对象的位置标识播放器/对象所在的图块。我的世界没有限制,所以世界可以是任何大小。磁贴大小已定义且恒定。因此,整个世界被划分为给定尺寸的正方形瓷砖。

示例:如果我将世界分成大小相等的正方形瓷砖,例如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);
}

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

注意:我也不知道这个问题叫什么!因此,这使我很难搜索。我的搜索使我找到了多个与圆,半径,圆内的点等相关的地方,

c# unity3d 2d coordinates tiles
1个回答
0
投票

我建议您使用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优于负数的整数除法。

© www.soinside.com 2019 - 2024. All rights reserved.