Arrays Lua中的三维表格
我需要最好的方式来存储像素的三维表格。我需要做的是有多个x,y表(基本上是三维的),它是光栅多个二维像素地图的透明度。你看,我可以像这样轻松地创建两个维度:Arrays Lua中的三维表格,arrays,multidimensional-array,lua,lua-table,Arrays,Multidimensional Array,Lua,Lua Table,我需要最好的方式来存储像素的三维表格。我需要做的是有多个x,y表(基本上是三维的),它是光栅多个二维像素地图的透明度。你看,我可以像这样轻松地创建两个维度: pixels = {{},{}} pixels[1][5] = "green" --just an example print(pixels[1][5]) 但是,我不能像在Java中那样做 pixels = {{}, {}, {}} pixels[1][4][3] = "red" -- [x][y][z] print(pixels[1][
pixels = {{},{}}
pixels[1][5] = "green" --just an example
print(pixels[1][5])
但是,我不能像在Java中那样做
pixels = {{}, {}, {}}
pixels[1][4][3] = "red" -- [x][y][z]
print(pixels[1][4][3])
这是我想要的功能,但我已经通过这样做来绕开它
pixels = {}
pixels["x23,y02,z05"] = "green"
print(pixels["x23,y02,z05"]")
我只是使用string.sub和string.concat来读取和设置表格。。。我确实希望示例2的功能能够正常工作,但是我知道它可能需要以不同的方式实现 在您的第一个代码中:
pixels = {{},{}}
相当于:
pixels = {}
pixels[1] = {}
pixels[2] = {}
在这里,pixels[1]
已经是一个表,这就是为什么您可以为pixels[1][5]
赋值
但在你的第二段代码中:
pixels = {{}, {}, {}}
这里,像素
仍然是一个二维数组(包含3个元素)。这相当于:
pixels = {}
pixels[1] = {}
pixels[2] = {}
pixels[3] = {}
pixels[1]
是一个表,但pixels[1][4]
不是。您需要做的是为像素[1][4]
提供如下表构造函数:
pixels = {{}, {}, {}}
pixels[1][4] = {} --initialize it to an empty table
pixels[1][4][3] = "red"
print(pixels[1][4][3])
除了经典的“array-In-array-In-array”方案外,您还可以利用Lua表内部的优点。怎么用?Lua表只是一个从键到值的映射,当您将它用作数组时,您可能会跳过一些键,而这几乎不需要任何成本
t = { }
t[1] = "Hello"
t[500000] = "World" -- does NOT allocate additional 499999 elements
因此,如果数据稀疏(超过50%的3d点没有价值),您可能会从中受益:
local n_x, n_y, n_z = 1920, 1080, 1000
local n_xy = n_x * n_y
function setValue(t, x, y, z, value)
assert(x > 0 and x < n_x)
assert(y > 0 and y < n_y)
assert(z > 0 and z < n_z)
t[((z-1) * n_xy) + ((y-1) * n_z) + x] = value
end
function getValue(t, x, y, z)
assert(x > 0 and x < n_x)
assert(y > 0 and y < n_y)
assert(z > 0 and z < n_z)
return t[((z-1) * n_xy) + ((y-1) * n_z) + x]
end
t = { }
setValue(t, 1, 1, 1, "red")
setValue(t, 1, 1, 2, "green")
本地n_x,n_y,n_z=1920108010000
局部n_xy=n_x*n_y
函数设置值(t、x、y、z、值)
断言(x>0和x0和y0和z0和x0和y0和z
基本上有两种方法
自动表格
自动表使用元表透明地生成子表,基本上在创建它之后,您应该能够忘记它们
function newAutotable(dim)
local MT = {};
for i=1, dim do
MT[i] = {__index = function(t, k)
if i < dim then
t[k] = setmetatable({}, MT[i+1])
return t[k];
end
end}
end
return setmetatable({}, MT[1]);
end
-- Usage
local at = newAutotable(3);
print(at[0]) -- returns table
print(at[0][1]) -- returns table
print(at[0][1][2]) -- returns nil
at[0][1][2] = 2;
print(at[0][1][2]) -- returns value
print(at[0][1][3][3]) -- error, because only 3 dimensions set
以及直接访问三维索引:
mdt(12, 13, 14, 0)
您还可以通过向元表添加一个
\u index
字段或使表保存矩阵维度等,轻松修改函数以返回缺少键的默认值。谢谢!每次我需要添加一个像素的时候,我都要初始化它吗?例如:对于i=1,50像素[i][i]={}像素[i][i][i]=“红色”结束,你知道。。。实际上,我会在for循环中创建一个for循环,但每次调用initilization是否正确?@user3214283在访问或分配其成员之前,请确保它已经是一个表。如果它已经是一张桌子,你就不需要再做了。谢谢你的自动调整功能!
for i=1, #mdt
mdt[i] = (mdt[i] or 0)*.5
end
mdt(12, 13, 14, 0)