4

1つのボックスの番号でグリッド上の位置の座標を取得するにはどうすればよいですか?

    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つの要素が含まれています。6で割るときの余りとしてxを定義します。

x〜myNumber%6

定義範囲が[1;6]であるため、+1を追加します。

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と呼ばれ、6による整数除算に比例します。

y〜myNumber / 6

しかし、ここでも、0からではなく1から開始していることを考慮する必要があります。

y〜myNumber / 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 };

x と y の値を見つけるための Linq:

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 に答える