使用数学查找项目在网格内的位置

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 - 6l 相同: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)