Algorithm 如何在无限网格/平面上计算点所属的单元?

Algorithm 如何在无限网格/平面上计算点所属的单元?,algorithm,math,Algorithm,Math,假设我有一个无限平面(在电脑游戏中),我在上面放置了一个由二次网格单元组成的虚拟网格。每个单元格的边长为len。该平面的中心以及网格的中心位于坐标X=0,Y=0。由于平面的大小是“无限的”(或至少非常大),网格从其中心点延伸到所有四个方向,X和Y上的正值和负值 现在我得到了平面上的一个随机点,坐标为px,py。我想计算这个点所属的网格单元。一个单元格被定义为它的中心点,以及它的边界(我想在所有四个方向上都是中心+len/2) 计算单元格的中心和边界的优雅方法是什么 bounds_x_min =

假设我有一个无限平面(在电脑游戏中),我在上面放置了一个由二次网格单元组成的虚拟网格。每个单元格的边长为
len
。该平面的中心以及网格的中心位于坐标
X=0,Y=0
。由于平面的大小是“无限的”(或至少非常大),网格从其中心点延伸到所有四个方向,
X
Y
上的正值和负值

现在我得到了平面上的一个随机点,坐标为px,py。我想计算这个点所属的网格单元。一个单元格被定义为它的
中心
点,以及它的
边界
(我想在所有四个方向上都是
中心+len/2

计算单元格的
中心和
边界的优雅方法是什么

bounds_x_min = math.floor(px / len);
bounds_x_max = bounds_x_min + 1;
center_x = average(bounds_x_min, bounds_x_max);
y
版本遵循相同的模式


y
版本遵循相同的模式。

定义矩形边界时,您只需要两个点,其中每个点表示相对的角。可以将一个点视为最小x和最小y值,而另一个点表示最大x和最大y值

查找网格单元索引 要知道我们在哪个网格单元中,我们可以使用

index_x = math.floor(px / len);
index_y = math.floor(py / len);
来自索引的边界框 如果我们想在原始坐标平面上找到描述
(index\u x,index\u y)
处网格单元的点,我们可以这样做:

min_x = index_x * len;
min_y = index_y * len;
max_x = min_x + len;
max_y = min_y + len;
模路 更优雅的版本是,当除以网格单元的长度时,使用计算坐标的剩余部分。我们可以通过去掉坐标中的余数得到最小坐标

min_x = px - (px % len);
min_y = py - (py % len);
寻找中心 如果需要边界框的中心点,可以执行以下操作:

center_x = min_x + len / 2;
center_y = min_y + len / 2;
这取决于框的边缘长度
len
。因此,中心点是距离最小x和y位置长度的一半

警告
如果您正在将其编程到计算机中,请小心,因为它可能会导致一些意外行为。尽管模方法很好,但它比
math.floor
更容易出现浮点错误

定义矩形边界时,您只需要两个点,其中每个点表示相对的角点。可以将一个点视为最小x和最小y值,而另一个点表示最大x和最大y值

查找网格单元索引 要知道我们在哪个网格单元中,我们可以使用

index_x = math.floor(px / len);
index_y = math.floor(py / len);
来自索引的边界框 如果我们想在原始坐标平面上找到描述
(index\u x,index\u y)
处网格单元的点,我们可以这样做:

min_x = index_x * len;
min_y = index_y * len;
max_x = min_x + len;
max_y = min_y + len;
模路 更优雅的版本是,当除以网格单元的长度时,使用计算坐标的剩余部分。我们可以通过去掉坐标中的余数得到最小坐标

min_x = px - (px % len);
min_y = py - (py % len);
寻找中心 如果需要边界框的中心点,可以执行以下操作:

center_x = min_x + len / 2;
center_y = min_y + len / 2;
这取决于框的边缘长度
len
。因此,中心点是距离最小x和y位置长度的一半

警告 如果您正在将其编程到计算机中,请小心,因为它可能会导致一些意外行为。尽管模方法很好,但它比
math.floor
更容易出现浮点错误