[已解决]在无限二维平面上找到一个点的图块索引,分为图块
[SOLVED]Finding Tile Index of a point- on an infinite 2D plane divided into tiles
我正试图将我的游戏世界分成Sectors/tiles。并根据 player/object 的位置确定 player/object 所在的图块。
我没有限制世界大小,所以世界可以是任何大小。磁贴大小已定义且恒定。因此,整个世界被划分为给定尺寸的正方形瓷砖。
示例:如果我将我的世界分成大小相等的正方形图块,比如 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);
}
我检查了以下问题,似乎与我有关:
- Dividing a 2D array into boxes - 和我的有完全相同的缺陷
- getting rectangular coordinates of tiles of a 2D map - 和我的问题完全一样
- How to create 3D tile maps using a Plane object divided into tiles? - 好像不是同一个问题
- Convert 2d game world coordinates to screen position - 好像不是同一个问题
- Converting from world coordinates to tile location - 似乎是另一个问题
注:我也不知道这个问题叫什么!所以,这让我很难搜索。我的搜索将我带到了多个与圆、半径、圆内点等相关的地方,
我建议您使用 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比负数的整数除法更好。
我正试图将我的游戏世界分成Sectors/tiles。并根据 player/object 的位置确定 player/object 所在的图块。 我没有限制世界大小,所以世界可以是任何大小。磁贴大小已定义且恒定。因此,整个世界被划分为给定尺寸的正方形瓷砖。
示例:如果我将我的世界分成大小相等的正方形图块,比如 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);
}
我检查了以下问题,似乎与我有关:
- Dividing a 2D array into boxes - 和我的有完全相同的缺陷
- getting rectangular coordinates of tiles of a 2D map - 和我的问题完全一样
- How to create 3D tile maps using a Plane object divided into tiles? - 好像不是同一个问题
- Convert 2d game world coordinates to screen position - 好像不是同一个问题
- Converting from world coordinates to tile location - 似乎是另一个问题
注:我也不知道这个问题叫什么!所以,这让我很难搜索。我的搜索将我带到了多个与圆、半径、圆内点等相关的地方,
我建议您使用 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比负数的整数除法更好。