让所有单元格与另一个单元格保持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距离内的所有单元格,而不必像我上面那样循环所有单元格?

让所有单元格与另一个单元格保持X距离.网格(XY)

我会从出口往回走,这样你就不用遍历每个贴图了。如果你不需要,我也不会存储距离,只是一个布尔值,表示瓷砖是否靠近出口。

这个表达式应该选择所有与出口相近或小于一定距离的贴图:

    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#,如果有任何语法错误,很抱歉,但这应该可以工作。不同之处在于,一个贴图可能离多个出口足够近,然后会多次出现在列表中。