如何从网格位置计算行/列?

时间:2011-08-23 17:03:48

标签: math language-agnostic

给定一个我知道行数(固定)的网格,并且我知道当前的列数(可以任意增长),如何根据它的索引计算一个正方形的行和列? / p>

           +   +   +   +   +
 Cols ---> | 0 | 1 | 2 | 3 | ...
        +--+---|---|---|---|---
         0 | 0 | 3 | 6 | 9 | ...
        +--+---|---|---|---|---
 Rows    1 | 1 | 4 | 7 | A | ...
        +--+---|---|---|---|---
         2 | 2 | 5 | 8 | B | ...
        +--+---|---|---|---|---
         .   .   .   .   .   ...
         .   .   .   .   .   .
         .   .   .   .   .   .

所以,给定:

final int mRowCount = /* something */;
int mColCount;

并给出了一些功能:

private void func(int index) {

    int row = index % mRowCount;
    int col = ???

如何正确计算col?它必须是列数和行数的函数,我很确定。但是我的大脑让我失望了。

示例:如果index == 4,则row = 1col = 1。如果index == 2然后row = 2col = 0

感谢。

7 个答案:

答案 0 :(得分:7)

int col = index / mRowCount;

答案 1 :(得分:5)

index = col * mRowCount + row

然后

row = index % mRowCount;

col = index / mRowCount;

答案 2 :(得分:4)

我相信该列将通过整数除法获得:

int col = index / mRowCount;

可以通过乘法和减法将其限制为单个除法(消除模数运算)。我不确定这是否成本更低;在大多数情况下可能无关紧要:

int col = index / mRowCount;
int row = index - col * mRowCount;

答案 3 :(得分:4)

没有真正理解你的设置,但是如果你有一个像Android GridLayout中那样具有渐进式索引的普通网格:

 +-------------------+
 | 0 | 1 | 2 | 3 | 4 |
 |---|---|---|---|---|
 | 5 | 6 | 7 | 8 | 9 | 
 |---|---|---|---|---|
 | 10| 11| 12| 13| 14|
 |---|---|---|---|---|
 | 15| 16| 17| 18| 19| 
 +-------------------+

计算结果如下:

int col = index % colCount;
int row = index / colCount;

例如:

row of index 6 = 6 / 5 = 1
column of index 12 = 12 % 5 = 2

答案 4 :(得分:0)

column = index / max_rows;
row    = index % max_rows;

答案 5 :(得分:0)

row = index / numberOfColumns

column = index%numberOfColumns

答案 6 :(得分:0)

row = CEILING(index / numberOfColumns)    

CEILING舍入到下一个整数

col = MOD(index / numberOfColumns)

,除了一个例外,您必须考虑->。当MOD = 0时,如果col结果为零,则您设置col=numberOfColumns (例如,假设numberOfColumns=48 ...那么,MOD(96, 48)是零,MOD(48, 48)=0也是...。。。因为被48整除的任何东西的MOD = 0 ... in换句话说,当MOD = 0时,您位于LAST或HIGHEST列中,而您位于numberOfColumns列中