【问题标题】:How can I get the coordinates of a location on the grid?如何获取网格上某个位置的坐标?
【发布时间】:2012-12-07 12:37:21
【问题描述】:

如何获取格子上某个位置的坐标与一个框的数量?

    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

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

感谢您的帮助

【问题讨论】:

  • 你可以使用二维数组吗?让我们看看你的代码
  • @Kay 谢谢,它解决了我的问题 :)
  • Zoners,通常它还有助于添加您已经尝试过的内容(您提到的功能),这样我们到目前为止看到您的尝试,如果它“接近”,您可以看到您在正确的轨道...
  • @Zoners 不客气 :-) 所以请将其标记为已回答。
  • @Zoners: y=0?我认为 x 和 y 以 1 开头。但是,my query 返回 X:6 Y:1 为 6。

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


【解决方案1】:

更新(公式错误):

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

更新(解释):

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

x ~ myNumber % 6

加上+1,定义范围为[​​1;6]。

x ~ myNumber % 6 + 1

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

x = (myNumber - 1) % 6 + 1

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

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

y ~ myNumber / 6

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

y ~ myNumber / 6 + 1

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

y = (myNumber - 1) / 6 + 1

【讨论】:

  • 但是没有解释。不好的答案。 (澄清:这是正确的答案,只是不是一个好答案)
  • @Ruirize +1 要求一些解释。但要澄清一下:第一个版本不是正确的答案,因为它有一个错误 ;-)
  • @Kay 谢谢你的解释,它解决了我的问题 :) 很好的解释
  • +0.5 用于回答速度,+0.5 用于纠正和解释答案。总分:+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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多