我目前正在开发一个带有单元格网格的项目。每个单元都能够使用接受相对“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' is the cell on which the query is supposedly called...
现在,到目前为止,我提出的最好的事情是这场势在必行的噩梦:
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'坐标感兴趣!
答案 0 :(得分:1)
您可以迭代整个X / Y方块并确定它们是否在每个X / Y对的菱形内:
for(int y = -3; y <= 3; y++)
{
for(int x = -3; x <= 3; x++)
{
if(Math.Abs(x) + Math.Abs(y) <= 3)
{
yield return _getRelativeCell(x, y);
}
}
}
这未经过测试,但您应该明白这一点。
为了使其更具自我记录功能,您还可以将if()移动到方法中,例如:
bool IsInRhombus(int x, int y)
{
return Math.Abs(x) + Math.Abs(y) <= 3;
}