Как я могу расположить эти точки (x,y) по порядку?
Я реализовал алгоритм A*, чтобы найти путь между двумя координатами, и он работает хорошо (в значительной степени).
После этого мне нужно показать круг, идущий шаг за шагом по пути
Проблема в том, что порядок добавления координат в список, чтобы (затем) показать их, основан на x, затем y; и, иногда, он должен изменить направление, как: влево, влево, влево, вверх, вверх, вверх, влево, влево, вниз, вниз, влево, вверх, вверх, вверх.
Я попытался упорядочить их по x, затем по y, по возрастанию и по убыванию, и наоборот, но из-за изменения направления не очень хорошо, чтобы круг шел шаг за шагом.
Итак, у меня была идея, но я не уверен, как это сделать:
Сначала: создайте другой список и установите идентификаторы для каждой точки. Второе: сделать начальную точку, из которой сделан путь, в качестве идентификатора 0 Третье: добавить другие координаты:
private async void showAnimation(int size)
{
int idOfMap = 0;
int xplus = 1;
int yplus = 1;
Mapa a = new Mapa();
List<Mapa> resultMap = new List<Mapa>();
foreach (Mapa camino in Mapa.mapaCamino)
{
if (camino.x == initialStore_x && camino.y == initialStore_y)
{
a.x = camino.x;
a.y = camino.y;
a.id = idOfMap.ToString();
resultMap.Add(a);
idOfMap++;
}
for (var i = 0; i < Mapa.mapaCamino.Count; i++)
{
if (camino.x == a.x)
{
if (camino.y == (a.y + yplus) || camino.y == (a.y - yplus))
{
}
}
}
}
(это то, что я до сих пор)
теперь моя проблема возникает, когда она должна подняться, например; после того, как это пошло вниз:
yplus = 5, после понижения... и в следующий раз, когда мне нужно будет проверить y, ему потребуется yplus, чтобы быть 4. И то же самое может случиться и с x (кроме того, я должен проверить, когда camino.x == ax + xplus и т. д.)
Итак, как можно было бы упорядочить эти элементы в списке из точки a в точку b?
Это фрагмент кода, если он помогает:
private void ShowRoute(IEnumerable<Point> path, int size)
{
Canvas myCanvas1 = new Canvas();
Canvas myCanvas2 = new Canvas();
for (int y = 0; y <= this.map.GetLength(1)-1; y++)
{
for (int x = 0; x < this.map.GetLength(0); x++)
{
//set the initial point
if (this.searchParameters.StartLocation.Equals(new Point(x, y)))
{
myCanvas1.Background = new SolidColorBrush(Colors.Red);
myCanvas1.Height = size;
myCanvas1.Width = size;
Canvas.SetTop(myCanvas1, (y) * size);
Canvas.SetLeft(myCanvas1, (x) * size);
myParentCanvas.Children.Add(myCanvas1);
}
//set the end point
else if (this.searchParameters.EndLocation.Equals(new Point(x, y)))
{
myCanvas2.Background = new SolidColorBrush(Colors.Blue);
myCanvas2.Height = size;
myCanvas2.Width = size;
Canvas.SetTop(myCanvas2, (y) * size);
Canvas.SetLeft(myCanvas2, (x) * size);
myParentCanvas.Children.Add(myCanvas2);
}
//add the whole path to a list
else if (this.map[x, y] == true)
{
if (path.Where(p => p.X == x && p.Y == y).Any())
{
Mapa pathToGo = new Mapa();
pathToGo.x = x;
pathToGo.y = y;
Mapa.mapaCamino.Add(pathToGo);
}
}
}
}
//show the path in the map
foreach (var camino in Mapa.mapaCamino)
{
ImageBrush yellowDot = new ImageBrush();
yellowDot.ImageSource = new BitmapImage(new Uri("ms-appx:/Imagenes/pathToOz.png", UriKind.Absolute));
Canvas myCanvas3 = new Canvas();
myCanvas3.Background = yellowDot;
myCanvas3.Height = (size + 2);
myCanvas3.Width = (size + 2);
Canvas.SetTop(myCanvas3, (camino.y) * size);
Canvas.SetLeft(myCanvas3, (camino.x) * size);
myParentCanvas.Children.Add(myCanvas3);
}
showAnimation(size);
}