我正在尝试创建Node
类型(自定义数据类型(的3D网格。
为了创建2D网格,我通常使用以下公式:
其中i
是1D循环中的当前迭代,gridsize
是网格的一个轴的大小
x = i % gridsize,
y = floor(i / gridsize)
例如,在Python:中
from math import floor
grid = list()
gridsize = 3 # 3x3 grid
for i in range(gridsize**2):
x = i % gridsize
y = floor(i / gridsize)
grid.append( Node(x, y) )
如何更改此公式以查找三维网格的x
、y
和z
坐标?是否有查找nD网格坐标的通用规则?
x
的上升速度最快,每次i
递增1,到达gridsize
:时结束
x = i % gridsize
y
上升得更慢,每次i
增加gridsize
时增加1,但当达到gridsize
:时也会结束
y = (i // gridsize) % gridsize
z
的上升速度最慢,每次i
增加gridsize**2
,就会增加1,我们不需要它:
z = i // gridsize**2
我们可以概括如下:
x = (i // gridsize**0) % gridsize
y = (i // gridsize**1) % gridsize
z = (i // gridsize**2) % gridsize
我相信你看到这里的图案了。
在为3x3x3网格写下x
、y
和z
值的表格后,我发现:
对于立方体3D´网格
x = i % gs
y = floor(i / gs) % gs
z = floor(i / gs²)
其中i
是当前迭代,而gs
是一个轴的长度。
经过一点外推,以下是nD网格的公式2:cn= floor(i / gsn-1) % gs
例如:
x = floor( i / gs⁰ ) % gs # 1D
y = floor( i / gs¹ ) % gs # 2D
z = floor( i / gs² ) % gs # 3D
a = floor( i / gs³ ) % gs # 4D
等等。
注意:
x
值可以简化为i % gs
,因为i/gs0% gs
=>CCD_ 26=>i % gs
。同样,我们可以从z
值的计算中删除% gs
,因为循环永远不应该超过gs3
- 此公式仅适用于立方体网格(即轴上点数相同的网格-2x2x2、5x5x5等(。例如,3x4x5网格需要不同的公式
我不会使用公式,只使用这个:
r = range(gridsize)
grid = [Node(x, y, z) for z in r for y in r for x in r]
或具有任意尺寸,使用itertools.product
:
grid = [Node(*p[::-1]) for p in product(range(gridsize), repeat=griddim)]
如果您不介意节点的顺序,可以省略[::-1]
,也可以使用itertools.starmap
:
grid = list(starmap(Node, product(range(gridsize), repeat=griddim)))