我正在嘗試創建Node型別的 3D 網格(自定義資料型別)。
要創建 2D 網格,我通常使用以下公式:1D 回圈中的當前迭代在
哪里,并且是網格的一個軸的大小igridsize
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) )
如何更改此公式以查找3D 網格的x、y和z坐標,是否有查找 nD 網格坐標的一般規則?
uj5u.com熱心網友回復:
x滴答速度最快,每次i遞增 1,并在達到 時回繞gridsize:
x = i % gridsize
y滴答聲更慢,每次i增加1 增加 1 gridsize,但在達到 時也會回繞gridsize:
y = (i // gridsize) % gridsize
z滴答聲最慢,每i增加1 就增加 1 gridsize**2,我們不需要它來回繞:
z = i // gridsize**2
我們可以概括一下:
x = (i // gridsize**0) % gridsize
y = (i // gridsize**1) % gridsize
z = (i // gridsize**2) % gridsize
我相信你在這里看到了模式。
uj5u.com熱心網友回復:
在寫出一個 3x3x3 網格的和值表之后x,我發現了這一點:yz
對于立方3D1 網格
x = i % gs
y = floor(i / gs) % gs
z = floor(i / gs2)
其中i是當前迭代,gs是一個軸的長度。
通過一些外推,這里是 nD 網格
的公式2 :
例如:cn = floor(i / gsn-1) % gs
x = floor( i / gs? ) % gs # 1D
y = floor( i / gs1 ) % gs # 2D
z = floor( i / gs2 ) % gs # 3D
a = floor( i / gs3 ) % gs # 4D
等等。
筆記:
- 該
x值可以簡化為i % gs因為=> => 。同樣,我們可以從值的計算中洗掉,因為回圈永遠不會結束
i/gs0 % gsi/1 % gsi % gs% gszgs3 - 此公式僅適用于立方網格(即,其軸上都有相同數量的點的網格 - 2x2x2x2、5x5x5 等)。例如,3x4x5 網格需要不同的公式。
uj5u.com熱心網友回復:
我不會使用公式,但就是這樣:
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)))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/449148.html
