4

如何以一个框的数量获得网格上某个位置的坐标?

    1  2  3  4  5  6  
------------------------------
1|  1  2  3  4  5  6  
2|  7  8  9 10 11 12 
3| 13 14 15 16 17 18
4| 19 20 21 22 23 24
5| 25 26 27 28 29 30
6| 31 32 33 34 35 36

即:如果我有数字 15,则坐标为 x=3;y=3

我尝试开发一个功能,但它不起作用,有人有想法吗?

谢谢你的帮助

4

2 回答 2

2

更新(公式错误):

y = (myNumber - 1) / 6 + 1;
x = (myNumber - 1) % 6 + 1;

更新(解释):

每行包含 6 个元素。我们将 x 除以 6 时定义为余数:

x ~ 我的号码 % 6

并添加+1,因为定义范围是[1;6]。

x ~ 我的号码 % 6 + 1

但是该行中的最后一个元素可以被 6 整除而没有余数。考虑到这一点,我们在应用模运算符之前从 myNumber 中减去 1:

x = (myNumber - 1) % 6 + 1

例如 myNumber = 1 => x = 1; 我的号码 = 6 => x = 6; 我的号码 = 7 => x = 1; 我的号码 = 12 => x = 6;

行数称为 y,与整数除以 6 成正比:

y ~ 我的号码 / 6

但是我们必须再次考虑,我们不是从 0 开始,而是从 1 开始:

y ~ 我的号码 / 6 + 1

再次存在“左移”,因为每行的最后一个元素可以除以 6 而没有余数。所以我们在除以之前从 myNumber 中减去 1 以反映这一点:

y = (myNumber - 1) / 6 + 1

于 2012-12-07T12:40:18.853 回答
2

您可以使用锯齿状数组:

private static readonly int[][] matrix = new int[6][];

// ...

matrix[0] = new int[] { 1, 2, 3, 4, 5, 6 };
matrix[1] = new int[] { 7, 8, 9, 10, 11, 12 };
matrix[2] = new int[] { 13, 14, 15, 16, 17, 18 };
matrix[3] = new int[] { 19, 20, 21, 22, 23, 24 };
matrix[4] = new int[] { 25, 26, 27, 28, 29, 30 };
matrix[5] = new int[] { 31, 32, 33, 34, 35, 36 };

和 Linq 找到 x 和 y 值:

int num = 15;
var matches = matrix
    .Select((yArr, index) => new { yArr, yPos = index + 1 })
    .Where(y => y.yArr.Contains(num))
    .Select(y => new
    {
        X = (y.yArr.Select((x, i) => new { x, i })
                   .First(x => x.x == num).i) + 1,
        Y = y.yPos,
    });

if(matches.Any())
{
    var firstMatch = matches.First();
    int x = firstMatch.X;
    int y = firstMatch.Y;
}

演示

于 2012-12-07T12:58:41.420 回答