如何获取网格上某个位置的坐标?

时间:2012-12-07 12:37:21

标签: c# c#-4.0 c#-3.0 coordinates

如何使用一个框的数量获取网格上某个位置的坐标?

    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

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

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

更新(公式错误):

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

更新(说明):

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

x~myNumber%6

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

x~myNumber%6 + 1

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

x =(myNumber - 1)%6 + 1

e.g。 myNumber = 1 => x = 1; myNumber = 6 => x = 6; myNumber = 7 => x = 1; myNumber = 12 => x = 6;

行数称为y,与整数除法成比例为6:

y~myNumber / 6

但我们还要考虑到我们不是从0开始,而是从1开始:

y~myNumber / 6 + 1

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

y =(myNumber - 1)/ 6 + 1

答案 1 :(得分: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;
}

DEMO