1

私は現在、セルを含むグリッドを特徴とするプロジェクトに取り組んでいます。すべてのセルには、相対 'x' および 'y' 座標を受け入れる関数を使用して、隣接するセルを照会する機能があります。これは問題なく動作しますが、次のように結合するとひし形を形成する隣接セルのセットを照会したいと思います。

* * * * * * * * *
* * * * 0 * * * *
* * * 0 0 0 * * *
* * 0 0 0 0 0 * *
* 0 0 0 C 0 0 0 *
* * 0 0 0 0 0 * *
* * * 0 0 0 * * *
* * * * 0 * * * *
* * * * * * * * *

「C」は、クエリが呼び出されると思われるセルです...

さて、私がこれまでに思いついた最高のものは、この命令的な悪夢です:

private IEnumerable<Cell> GetRhombusNeighours()
{
    yield return _getRelativeCell(-3, 0);

    yield return _getRelativeCell(-2, 1);
    yield return _getRelativeCell(-2, 0);
    yield return _getRelativeCell(-2, -1);

    yield return _getRelativeCell(-1, -2);
    yield return _getRelativeCell(-1, -1);
    yield return _getRelativeCell(-1, 0);
    yield return _getRelativeCell(-1, 1);
    yield return _getRelativeCell(-1, 2);

    yield return _getRelativeCell(0, -3);
    yield return _getRelativeCell(0, -2);
    yield return _getRelativeCell(0, -1);
    yield return _getRelativeCell(0, 0);
    yield return _getRelativeCell(0, 1);
    yield return _getRelativeCell(0, 2);
    yield return _getRelativeCell(0, 3);

    yield return _getRelativeCell(1, -2);
    yield return _getRelativeCell(1, -1);
    yield return _getRelativeCell(1, 0);
    yield return _getRelativeCell(1, 1);
    yield return _getRelativeCell(1, 2);

    yield return _getRelativeCell(2, 1);
    yield return _getRelativeCell(2, 0);
    yield return _getRelativeCell(2, -1);

    yield return _getRelativeCell(3, 0);
}

おそらく読みやすさを犠牲にして、いくつかの for ループを使用して、このメソッドをもう少し動的にすることができます。しかし、この問題を正確に解決するアルゴリズムはありませんか? 私は C# で作業していますが、言語に依存しないアドバイスを受け入れます!

エッジ/境界検出は必要ありません。それはすでにカバーされています。相対的な「X」座標と「Y」座標を収集することに純粋に興味があります。

4

1 に答える 1