【发布时间】:2015-01-12 12:20:06
【问题描述】:
我目前正在开发一个包含单元格的网格的项目。每个单元格都能够使用接受相对“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”坐标感兴趣!
【问题讨论】:
-
当然有。只看你画的。这是一个固定网格中的简单距离函数。您可以使用几个嵌套的 for 循环轻松编写代码。
标签: c# algorithm grid-layout array-algorithms