枚举网格上 'rhombus' 形状的相邻单元格
Enumerate neighboring cells in a 'rhombus'-shape on a grid
我目前正在从事一个项目,该项目的特点是带有单元格的网格。每个单元格都能够使用接受相对 '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# 工作,但我愿意接受与语言无关的建议!
不需要edge/border检测;那已经涵盖了。我纯粹是想收集相对的 'X'- 和 'Y'- 坐标!
您可以遍历整个 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;
}
我目前正在从事一个项目,该项目的特点是带有单元格的网格。每个单元格都能够使用接受相对 '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# 工作,但我愿意接受与语言无关的建议!
不需要edge/border检测;那已经涵盖了。我纯粹是想收集相对的 'X'- 和 'Y'- 坐标!
您可以遍历整个 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;
}