从一维循环创建n维网格的公式是什么



我正在尝试创建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) )

如何更改此公式以查找三维网格的xyz坐标?是否有查找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网格写下xyz值的表格后,我发现:

对于立方体3D´网格

x = i % gs
y = floor(i / gs) % gs
z = floor(i / gs²)

其中i是当前迭代,而gs是一个轴的长度。

经过一点外推,以下是nD网格的公式2cn= 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 

等等。

注意:

  1. x值可以简化为i % gs,因为
    i/gs0% gs=>CCD_ 26=>i % gs。同样,我们可以从z值的计算中删除% gs,因为循环永远不应该超过gs3
  2. 此公式仅适用于立方体网格(即轴上点数相同的网格-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)))

相关内容

  • 没有找到相关文章

最新更新