让所有单元格与另一个单元格保持X距离.网格(XY)
本文关键字:单元格 网格 距离 XY 另一个 | 更新日期: 2023-09-27 18:18:17
目前我有一个函数,通过网格和更新单元格的距离最近的单元格标记为出口。
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距离内的所有单元格,而不必像我上面那样循环所有单元格?
我会从出口往回走,这样你就不用遍历每个贴图了。如果你不需要,我也不会存储距离,只是一个布尔值,表示瓷砖是否靠近出口。
这个表达式应该选择所有与出口相近或小于一定距离的贴图:
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#,如果有任何语法错误,很抱歉,但这应该可以工作。不同之处在于,一个贴图可能离多个出口足够近,然后会多次出现在列表中。