在二维网格中查找最接近的值 C#
Find closest value in a 2d grid c#
我创建了一个用于模拟机器人应用程序的 c# 控制台应用程序。
我已经为机器人创建了一个 2D 网格来移动:
List<List<int> Map;
地图是一个 25x25 的网格(首先)并填充了以下值:
0 = Unexplored space,
1 = Explored space,
2 = Wall,
3 = Obstacle,
9 = Robot
机器人从位置 (12,12) 开始。
我希望能够在该网格中搜索最近的 Unexplored space 和 return 那个位置,这样我就可以将该位置和机器人位置提供给 A* 搜索算法进行规划。
在地图中搜索所述值的最有效方法是什么?
谢谢:)
这是在记事本上写的,所以我还没有测试过,但你应该知道了。
基本上获取所有未探索的地方并按与当前位置的距离对它们进行排序并获取列表中的第一个值。
CalculateDistance 方法应实现提到的公式 Nikola.Lukovic。
public KeyValuePair<int, int> GetClosestUnexploredPosition(List<List<int>> map, int currentX, int currentY)
{
Dictionary<KeyValuePair<int, int>, double> unexploredPlaces = new Dictionary<KeyValuePair<int, int>, double>();
foreach (List<int> valueList in map)
{
foreach (int value in valueList)
{
if (value == 0)
{
int x = map.IndexOf(valueList);
int y = valueList.IndexOf(value));
if (x != currentX && y != currentY)
{
unexploredPlaces.Add(new KeyValuePair(x, y), CalculateDistance(currentX, currentY, x, y));
}
}
}
}
return unexploredPlaces.OrderBy(x => x.Value).FirstOrDefault();
}
我创建了一个用于模拟机器人应用程序的 c# 控制台应用程序。 我已经为机器人创建了一个 2D 网格来移动:
List<List<int> Map;
地图是一个 25x25 的网格(首先)并填充了以下值:
0 = Unexplored space,
1 = Explored space,
2 = Wall,
3 = Obstacle,
9 = Robot
机器人从位置 (12,12) 开始。 我希望能够在该网格中搜索最近的 Unexplored space 和 return 那个位置,这样我就可以将该位置和机器人位置提供给 A* 搜索算法进行规划。
在地图中搜索所述值的最有效方法是什么?
谢谢:)
这是在记事本上写的,所以我还没有测试过,但你应该知道了。 基本上获取所有未探索的地方并按与当前位置的距离对它们进行排序并获取列表中的第一个值。 CalculateDistance 方法应实现提到的公式 Nikola.Lukovic。
public KeyValuePair<int, int> GetClosestUnexploredPosition(List<List<int>> map, int currentX, int currentY)
{
Dictionary<KeyValuePair<int, int>, double> unexploredPlaces = new Dictionary<KeyValuePair<int, int>, double>();
foreach (List<int> valueList in map)
{
foreach (int value in valueList)
{
if (value == 0)
{
int x = map.IndexOf(valueList);
int y = valueList.IndexOf(value));
if (x != currentX && y != currentY)
{
unexploredPlaces.Add(new KeyValuePair(x, y), CalculateDistance(currentX, currentY, x, y));
}
}
}
}
return unexploredPlaces.OrderBy(x => x.Value).FirstOrDefault();
}