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

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。

我尝试开发一个函数,但它不起作用,是否有人有想法?

感谢您的帮助。


你可以使用二维数组吗?让我们看看你的代码。 - t1w
通常来说,Zoners,如果您加上您已经尝试过的内容(即您提到的函数),我们可以看到您迄今为止的尝试,如果它们“接近”,您就可以看到您走在正确的轨道上... - curtisk
@Kay,我发现一个问题,如果数字是6,使用你的函数:x=0和y=2,正确的响应应该是x=6和y=0,如果数字等于6。 - Zoners
1
@Zoners: y=0?我以为x和y都从1开始。然而,我的查询对于6返回X:6 Y:1链接 - Tim Schmelter
@Zoners 是的,我也注意到了这一点。我修改了我的答案并添加了一些解释。 - Kay
@区域管理员,请在Kay的回答下方使用评论部分,如果主题不是普遍性的。 - daniloquio
2个回答

3

更新(公式有误):


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

例如:myNumber = 1 => x = 1; myNumber = 6 => x = 6; myNumber = 7 => x = 1; myNumber = 12 => x = 6;

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

y ~ myNumber / 6

但是再次需要考虑的是我们不是从0开始而是从1开始:

y ~ myNumber / 6 + 1

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

y = (myNumber - 1) / 6 + 1


1
但是没有解释。回答不好。 (澄清一下:这是正确的答案,只是不够好) - Steffan Donal
@Ruirize +1 要求解释。但是为了澄清:第一个版本不是正确的答案,因为它有一个错误;-) - Kay
1
Variables in programming are used to store data values. - daniloquio

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;
}

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接