Как я могу расположить эти точки (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);
    }

0 ответов

Другие вопросы по тегам