目前,我有一个功能可以通过网格并更新单元格到标记为出口的最近单元格的距离。
foreach(var tile in TileList.Values.ToList())
{
tile.DistanceToExit = this.GetDistanceToExit(tile);
}
public int GetDistanceToExit(Tile wantedTile)
{
int closestTileDistance = int.MaxValue;
foreach(var tmptile in TileList.Where(o=>o.Value.Type== TileType.Exit))
{
int dx = tmptile.Key.x - wantedTile.Location.x;
int dy = tmptile.Key.y - wantedTile.Location.y;
double distance = Math.Sqrt(dx*dx + dy*dy);
int dis = (int)Math.Round(distance, MidpointRounding.AwayFromZero);
if(dis < closestTileDistance)
{
closestTileDistance = dis;
}
}
return closestTileDistance;
}
问题是当你开始进入100x100尺寸的网格时,这是非常慢的。
我只需知道退出单元格的X单元格中有哪些单元格。所以我在想我应该从退出处倒退。
是否存在一种算法,可以获取指定单元格X距离内的所有单元格,而不必像上面那样循环遍历所有单元格?
答案 0 :(得分:2)
我会从出口后退,所以你不必遍历每个瓷砖。如果你不需要,我也不会存储距离,只是一个布尔表示瓷砖是否靠近出口。
此表达式应选择距离出口一定距离或距离较近的所有图块:
List<Tile> exits = tiles.Where(t=>t.type = exit).ToList()
List<Tile> closeTiles = exits.SelectMany(e=> tiles.Where(t=> ((t.X - e.X) ^ 2) + ((t.X - e.X) ^ 2) <= distance ^ 2)).Distinct().ToList()
我在VB中编写了这个,然后将其转换为C#,如果有任何语法错误,请对不起,但这应该有效。区别在于因为一个区块可能足够接近多个出口,然后会多次出现在列表中。