使用数学查找项目在网格内的位置
finding position of an item inside a grid using math
我想找到排列在 6x6 网格中的数组项的位置。
我想出了两个公式来查找项目的 X 轴和 Y 轴,但是当我想获得项目在网格中一行最后一个位置的位置时,计算结果为 0 6 和 Y 轴也关闭。
这是您需要知道的(底部的完整 Lua 代码):
你想在 6x6 网格中排列英文字母的字符。
你知道每个字母在字母表中的位置(例如 i 将是 9 而 w 将是 23) - 你需要这个来计算.
字符从左到右写在网格中,当您到达一行中的最后一个位置时,您将从下一行的左侧开始。
Don't mind the empty spots, you can fill them with imaginary letters, but they don't matter to us.
这是它的样子。因此 i 的坐标 (x; y) 将是:3;2
。
现在计算:
解释 Y 轴的计算对我来说有点太复杂了,所以我会跳过它们。这是公式:
(charTableItem.index + (XAxisSize - itemIndex % XAxisSize))/XAxisSize
这是带有解释的 X 轴:(遗憾的是你需要 Y 轴)
itemIndex - XAxisSize * (charYPos-1)
快速解释:
itemIndex 是英文字母表中字母的索引。
XAxisSize 是行数——对我们来说是 6。
charYPos 是项目所在的行。
我对这背后逻辑的解释:
您获取字母表中字母的索引,然后从中减去其上方的行数乘以每行中的单元格数。为什么要减1?因为我们只想减去上面的行,而不是项目所在的行。
所以这应该可以完美地工作。但是,当您到达一行中的最后一个单元格时,计算只会导致 0。以字母 f 为例。现在计算是 6 - 6 * (2.0-1)
那就是 6 - 6 * 1
那就是 6 - 6
。 l 相同:12 - 6 * (3.0-1)
-> 12 - 6 * 2
-> 12 - 12
。你现在肯定看到了问题。对于一行中的每个其他单元格,计算总是正确的。
那么我该如何仅使用数学来解决这个问题呢?我不想使用 if
函数,因为它应该只用数学就可以完成。
lua代码:
local charTable = {{char= "a", index= 1, xpos = 1, ypos = 1},{char= "b", index= 2, xpos = 2, ypos = 1},{char= "c", index= 3, xpos = 3, ypos = 1},{char= "d", index= 4, xpos = 4, ypos = 1},{char= "e", index= 5, xpos = 5, ypos = 1},{char= "f", index= 6, xpos = 6, ypos = 1},{char= "g", index= 7, xpos = 1, ypos = 2},{char= "h", index= 8, xpos = 2, ypos = 2},{char= "i", index= 9, xpos = 3, ypos = 2},{char= "j", index= 10, xpos = 4, ypos = 2},{char= "k", index= 11, xpos = 5, ypos = 2},{char= "l", index= 12, xpos = 6, ypos = 2},{char= "m", index= 13, xpos = 1, ypos = 3},{char= "n", index= 14, xpos = 2, ypos = 3},{char= "o", index= 15, xpos = 3, ypos = 3},{char= "p", index= 16, xpos = 4, ypos = 3},{char= "q", index= 17, xpos = 5, ypos = 3},{char= "r", index= 18, xpos = 6, ypos = 3},{char= "s", index= 19, xpos = 1, ypos = 4},{char= "t", index= 20, xpos = 2, ypos = 4},{char= "u", index= 21, xpos = 3, ypos = 4},{char= "v", index= 22, xpos = 4, ypos = 4},{char= "w", index= 23, xpos = 5, ypos = 4},{char= "x", index= 24, xpos = 6, ypos = 4},{char= "y", index= 25, xpos = 1, ypos = 5},{char= "z", index= 26, xpos = 2, ypos = 5},}
local gridSize = 6
local function mainFunc(charTableItem)
local YAxisSize = (#charTable + (gridSize - #charTable % gridSize))/gridSize -- not needed for the calculation of char position
local XAxisSize = gridSize -- just for better understanding of what we're working with
local charYPos = (charTableItem.index + (XAxisSize - charTableItem.index % XAxisSize))/XAxisSize
local charXPos = charTableItem.index - XAxisSize * (charYPos-1)
-- this is just a check - not part of the calculation - obviously
local isXSame = false
if charTableItem.xpos == charXPos then
isXSame = true
end
local isYSame = false
if charTableItem.ypos == charYPos then
isYSame = true
end
print("=========================================================================================")
print(charTableItem.char.." Y position: ", charYPos, " |", charTableItem.ypos, "|", isYSame, "("..charTableItem.index.." + ("..XAxisSize.." - "..charTableItem.index.." % "..XAxisSize.."))/"..XAxisSize)
print(charTableItem.char.." X position: ", charXPos, " |", charTableItem.xpos, "|", isXSame, charTableItem.index.." - "..XAxisSize.." * ("..charYPos.."-1)")
return {x = charXPos, y = charYPos}
end
for i in pairs(charTable) do
mainFunc(charTable[i])
end
这是输出:
=========================================================================================
a Y position: 1.0 | 1 | true (1 + (6 - 1 % 6))/6
a X position: 1.0 | 1 | true 1 - 6 * (1.0-1)
=========================================================================================
b Y position: 1.0 | 1 | true (2 + (6 - 2 % 6))/6
b X position: 2.0 | 2 | true 2 - 6 * (1.0-1)
=========================================================================================
c Y position: 1.0 | 1 | true (3 + (6 - 3 % 6))/6
c X position: 3.0 | 3 | true 3 - 6 * (1.0-1)
=========================================================================================
d Y position: 1.0 | 1 | true (4 + (6 - 4 % 6))/6
d X position: 4.0 | 4 | true 4 - 6 * (1.0-1)
=========================================================================================
e Y position: 1.0 | 1 | true (5 + (6 - 5 % 6))/6
e X position: 5.0 | 5 | true 5 - 6 * (1.0-1)
=========================================================================================
f Y position: 2.0 | 1 | false (6 + (6 - 6 % 6))/6
f X position: 0.0 | 6 | false 6 - 6 * (2.0-1)
=========================================================================================
g Y position: 2.0 | 2 | true (7 + (6 - 7 % 6))/6
g X position: 1.0 | 1 | true 7 - 6 * (2.0-1)
=========================================================================================
h Y position: 2.0 | 2 | true (8 + (6 - 8 % 6))/6
h X position: 2.0 | 2 | true 8 - 6 * (2.0-1)
=========================================================================================
i Y position: 2.0 | 2 | true (9 + (6 - 9 % 6))/6
i X position: 3.0 | 3 | true 9 - 6 * (2.0-1)
=========================================================================================
j Y position: 2.0 | 2 | true (10 + (6 - 10 % 6))/6
j X position: 4.0 | 4 | true 10 - 6 * (2.0-1)
=========================================================================================
k Y position: 2.0 | 2 | true (11 + (6 - 11 % 6))/6
k X position: 5.0 | 5 | true 11 - 6 * (2.0-1)
=========================================================================================
l Y position: 3.0 | 2 | false (12 + (6 - 12 % 6))/6
l X position: 0.0 | 6 | false 12 - 6 * (3.0-1)
=========================================================================================
m Y position: 3.0 | 3 | true (13 + (6 - 13 % 6))/6
m X position: 1.0 | 1 | true 13 - 6 * (3.0-1)
=========================================================================================
n Y position: 3.0 | 3 | true (14 + (6 - 14 % 6))/6
n X position: 2.0 | 2 | true 14 - 6 * (3.0-1)
=========================================================================================
您刚才 charYPos
的计算错误,导致您的 charXPos
也有误。
So this should work perfectly.
However, when you reach the last cell in a row, the calculation just leads to 0. Take the letter f. Now the calculation is 6 - 6 * (2.0-1)
that's 6 - 6 * 1
and that's 6 - 6
.
从网格来看,字母 f 在第 1 行,而不是第 2 行。所以 charYPos
应该是 1。
然后 6 - 6 * (1 - 1)
即 6 - 6 * (0)
导致 6
.
要正确计算 charYPos
,请使用 charYPos = math.ceil(itemIndex / XAxisSize)
我想找到排列在 6x6 网格中的数组项的位置。 我想出了两个公式来查找项目的 X 轴和 Y 轴,但是当我想获得项目在网格中一行最后一个位置的位置时,计算结果为 0 6 和 Y 轴也关闭。
这是您需要知道的(底部的完整 Lua 代码):
你想在 6x6 网格中排列英文字母的字符。
你知道每个字母在字母表中的位置(例如 i 将是 9 而 w 将是 23) - 你需要这个来计算.
字符从左到右写在网格中,当您到达一行中的最后一个位置时,您将从下一行的左侧开始。
Don't mind the empty spots, you can fill them with imaginary letters, but they don't matter to us.
这是它的样子。因此 i 的坐标 (x; y) 将是:3;2
。
现在计算:
解释 Y 轴的计算对我来说有点太复杂了,所以我会跳过它们。这是公式:
(charTableItem.index + (XAxisSize - itemIndex % XAxisSize))/XAxisSize
这是带有解释的 X 轴:(遗憾的是你需要 Y 轴)
itemIndex - XAxisSize * (charYPos-1)
快速解释:
itemIndex 是英文字母表中字母的索引。
XAxisSize 是行数——对我们来说是 6。
charYPos 是项目所在的行。
我对这背后逻辑的解释: 您获取字母表中字母的索引,然后从中减去其上方的行数乘以每行中的单元格数。为什么要减1?因为我们只想减去上面的行,而不是项目所在的行。
所以这应该可以完美地工作。但是,当您到达一行中的最后一个单元格时,计算只会导致 0。以字母 f 为例。现在计算是 6 - 6 * (2.0-1)
那就是 6 - 6 * 1
那就是 6 - 6
。 l 相同:12 - 6 * (3.0-1)
-> 12 - 6 * 2
-> 12 - 12
。你现在肯定看到了问题。对于一行中的每个其他单元格,计算总是正确的。
那么我该如何仅使用数学来解决这个问题呢?我不想使用 if
函数,因为它应该只用数学就可以完成。
lua代码:
local charTable = {{char= "a", index= 1, xpos = 1, ypos = 1},{char= "b", index= 2, xpos = 2, ypos = 1},{char= "c", index= 3, xpos = 3, ypos = 1},{char= "d", index= 4, xpos = 4, ypos = 1},{char= "e", index= 5, xpos = 5, ypos = 1},{char= "f", index= 6, xpos = 6, ypos = 1},{char= "g", index= 7, xpos = 1, ypos = 2},{char= "h", index= 8, xpos = 2, ypos = 2},{char= "i", index= 9, xpos = 3, ypos = 2},{char= "j", index= 10, xpos = 4, ypos = 2},{char= "k", index= 11, xpos = 5, ypos = 2},{char= "l", index= 12, xpos = 6, ypos = 2},{char= "m", index= 13, xpos = 1, ypos = 3},{char= "n", index= 14, xpos = 2, ypos = 3},{char= "o", index= 15, xpos = 3, ypos = 3},{char= "p", index= 16, xpos = 4, ypos = 3},{char= "q", index= 17, xpos = 5, ypos = 3},{char= "r", index= 18, xpos = 6, ypos = 3},{char= "s", index= 19, xpos = 1, ypos = 4},{char= "t", index= 20, xpos = 2, ypos = 4},{char= "u", index= 21, xpos = 3, ypos = 4},{char= "v", index= 22, xpos = 4, ypos = 4},{char= "w", index= 23, xpos = 5, ypos = 4},{char= "x", index= 24, xpos = 6, ypos = 4},{char= "y", index= 25, xpos = 1, ypos = 5},{char= "z", index= 26, xpos = 2, ypos = 5},}
local gridSize = 6
local function mainFunc(charTableItem)
local YAxisSize = (#charTable + (gridSize - #charTable % gridSize))/gridSize -- not needed for the calculation of char position
local XAxisSize = gridSize -- just for better understanding of what we're working with
local charYPos = (charTableItem.index + (XAxisSize - charTableItem.index % XAxisSize))/XAxisSize
local charXPos = charTableItem.index - XAxisSize * (charYPos-1)
-- this is just a check - not part of the calculation - obviously
local isXSame = false
if charTableItem.xpos == charXPos then
isXSame = true
end
local isYSame = false
if charTableItem.ypos == charYPos then
isYSame = true
end
print("=========================================================================================")
print(charTableItem.char.." Y position: ", charYPos, " |", charTableItem.ypos, "|", isYSame, "("..charTableItem.index.." + ("..XAxisSize.." - "..charTableItem.index.." % "..XAxisSize.."))/"..XAxisSize)
print(charTableItem.char.." X position: ", charXPos, " |", charTableItem.xpos, "|", isXSame, charTableItem.index.." - "..XAxisSize.." * ("..charYPos.."-1)")
return {x = charXPos, y = charYPos}
end
for i in pairs(charTable) do
mainFunc(charTable[i])
end
这是输出:
=========================================================================================
a Y position: 1.0 | 1 | true (1 + (6 - 1 % 6))/6
a X position: 1.0 | 1 | true 1 - 6 * (1.0-1)
=========================================================================================
b Y position: 1.0 | 1 | true (2 + (6 - 2 % 6))/6
b X position: 2.0 | 2 | true 2 - 6 * (1.0-1)
=========================================================================================
c Y position: 1.0 | 1 | true (3 + (6 - 3 % 6))/6
c X position: 3.0 | 3 | true 3 - 6 * (1.0-1)
=========================================================================================
d Y position: 1.0 | 1 | true (4 + (6 - 4 % 6))/6
d X position: 4.0 | 4 | true 4 - 6 * (1.0-1)
=========================================================================================
e Y position: 1.0 | 1 | true (5 + (6 - 5 % 6))/6
e X position: 5.0 | 5 | true 5 - 6 * (1.0-1)
=========================================================================================
f Y position: 2.0 | 1 | false (6 + (6 - 6 % 6))/6
f X position: 0.0 | 6 | false 6 - 6 * (2.0-1)
=========================================================================================
g Y position: 2.0 | 2 | true (7 + (6 - 7 % 6))/6
g X position: 1.0 | 1 | true 7 - 6 * (2.0-1)
=========================================================================================
h Y position: 2.0 | 2 | true (8 + (6 - 8 % 6))/6
h X position: 2.0 | 2 | true 8 - 6 * (2.0-1)
=========================================================================================
i Y position: 2.0 | 2 | true (9 + (6 - 9 % 6))/6
i X position: 3.0 | 3 | true 9 - 6 * (2.0-1)
=========================================================================================
j Y position: 2.0 | 2 | true (10 + (6 - 10 % 6))/6
j X position: 4.0 | 4 | true 10 - 6 * (2.0-1)
=========================================================================================
k Y position: 2.0 | 2 | true (11 + (6 - 11 % 6))/6
k X position: 5.0 | 5 | true 11 - 6 * (2.0-1)
=========================================================================================
l Y position: 3.0 | 2 | false (12 + (6 - 12 % 6))/6
l X position: 0.0 | 6 | false 12 - 6 * (3.0-1)
=========================================================================================
m Y position: 3.0 | 3 | true (13 + (6 - 13 % 6))/6
m X position: 1.0 | 1 | true 13 - 6 * (3.0-1)
=========================================================================================
n Y position: 3.0 | 3 | true (14 + (6 - 14 % 6))/6
n X position: 2.0 | 2 | true 14 - 6 * (3.0-1)
=========================================================================================
您刚才 charYPos
的计算错误,导致您的 charXPos
也有误。
So this should work perfectly. However, when you reach the last cell in a row, the calculation just leads to 0. Take the letter f. Now the calculation is
6 - 6 * (2.0-1)
that's6 - 6 * 1
and that's6 - 6
.
从网格来看,字母 f 在第 1 行,而不是第 2 行。所以 charYPos
应该是 1。
然后 6 - 6 * (1 - 1)
即 6 - 6 * (0)
导致 6
.
要正确计算 charYPos
,请使用 charYPos = math.ceil(itemIndex / XAxisSize)