我有一个表格,表示一个65 * 65的正方形网格,其中每个元素都是整数值。它代表一个演员周围的区域,演员可以在四个主要方向上移动,当他们这样做时,我需要桌子与它们一起移动,使它们保持在中心方格33,33。
而不是移动表的元素我改为有两个指针tableIndex.left和tableIndex.down分别存储底行最左列的索引,它们都从65开始。我有三个辅助函数对表进行操作,都取参数x1,x2,y1,y2,其中x1和y1是坐标,以启动函数at,x2和y2是坐标,以结束函数。
这些函数是tableInit,它在x1和x2之间的所有值中创建表。零表,用0填充指定范围内的所有条目,清除表将指定范围内的所有条目设置为nil。
function movetable(direction)
--function to move our probability histogram
-- 0 is up, 1 is right, 2 is down, 3 is left
--as a note robotSpeed = 1
if direction == 0 then
tableIndex.down += robotSpeed
zerotable(tableIndex.left,tableIndex.left+64,tableIndex.down+64,tableIndex.down+64)
cleartable(tableIndex.left,tableIndex.left+64,tableIndex.down-1,tableIndex.down-1)
elseif direction == 1 then
tableIndex.left += robotSpeed
tableInit(tableIndex.left+64,tableIndex.left+64)
zerotable(tableIndex.left+64,tableIndex.left+64,tableIndex.down,tableIndex.down+64)
cleartable(tableIndex.left-1,tableIndex.left-1,tableIndex.down,tableIndex.down+64)
elseif direction == 2 then
tableIndex.down -= robotSpeed
zerotable(tableIndex.left,tableIndex.left+64,tableIndex.down,tableIndex.down)
cleartable(tableIndex.left,tableIndex.left+64,tableIndex.down+65,tableIndex.down+65)
else
tableIndex.left -= robotSpeed
tableInit(tableIndex.left,tableIndex.left)
zerotable(tableIndex.left,tableIndex.left,tableIndex.down,tableIndex.down+64)
cleartable(tableIndex.left+65,tableIndex.left+65,tableIndex.down,tableIndex.down+64)
end
end
该程序稍后在程序中调用,在下面的代码部分中,这是引发错误的地方"尝试对字段执行算术'?'零值。当i和j为0时会发生这种情况。这只发生在表最后一次向上移动之后,因此dir == 0并且如果我在dir == 0的情况下注释掉我的movetable函数中的cleartable调用,则错误不再存在。
for i=0,64 do
for j=0,64 do
--Robot is at 33 33 so we know there isnt an obstacle here
if i ~= 32 and j ~= 32 then
--This is the equation from the paper which tells us which direction the result is in
local tan = atan2(i-33,j-33)+0.25
if (tan > 1) tan = tan-1
local dInD = flr(360*tan)
--Our polar histogram has sectors ALPHA degrees wide, this rounds the direction down to a multiple of
--the sector size so we can use it as an index
local dir = dInD - dInD%ALPHA
polarHist[dir] += certaintyTable[tableIndex.left+i][tableIndex.down+j]
end
end
作为一个注释,我无法访问标准的lua库。
如果我做错了,这里是可以理解的
function cleartable(x1,x2,y1,y2)
if x1 == x2 then
for j=y1,y2 do
certaintyTable[x1][j] = nil
end
elseif y1==y2 then
for i=x1,x2 do
certaintyTable[i][y1] = nil
end
else
for i=x1,x2 do
for j=y1,y2 do
certaintyTable[i][j] = nil
end
end
end
end
感谢您查看我的问题