Ejemplo n.º 1
0
    public List <Vector3> FindFlatRoute(Vector3 origin, Vector3 destination)
    {
        var open = new MinHeap <RouteElem>();   //Хипа вместо приоритетой очереди
        var orig = FindVertex(origin);          //Находим вершину старт
        var dest = FindVertex(destination);     //Вершину, ближайшую к точку назначения

        var closed = new List <Vector3>();      //Список пройденных вершин

        if (orig == null || dest == null)
        {
            throw new ArithmeticException();
        }

        var first = new RouteElem(orig, 0, destination, null);

        open.Add(first); //Добавляем стартовый элемент в хипу

        RouteElem current = null;

        while (!open.IsEmpty())
        {
            current = open.Pop();   //Достаем наиболее оптимальную вершину
            var x = current.Vert;

            if (In(closed, x.Coord))
            {
                continue;
            }
            if (x.Coord == dest.Coord)
            {
                break; //return path
            }
            closed.Add(x.Coord);

            foreach (var vert in CloserVertices(current.Vert.Coord))
            {
                if (!In(closed, vert.Coord))
                {
                    var tmp = new RouteElem(vert, current.G + Vector3.Distance(current.Vert.Coord, vert.Coord), destination, current);
                    open.Add(tmp);  //TODO: OPTIMIZE -> AddRange() - only 1 balance
                }
            }
        }

        if (current == null)
        {
            return(new List <Vector3>());
        }

        var last = current;
        var path = new List <Vector3>();

        var currElem = last;

        while (currElem.PrevElem != null)
        {
            path.Add(currElem.Vert.Coord);
            currElem = currElem.PrevElem;
        }
        path.Add(currElem.Vert.Coord);

        path.Reverse();
        return(path);
    }
Ejemplo n.º 2
0
    public List <Vector3> OLDFindRoute(Vector3 origin, Vector3 destination)
    {
        var heap = new MinHeap <RouteElem>();   //Хипа вместо приоритетой очереди
        var orig = FindVertex(origin);          //Находим вершину старт
        var dest = FindVertex(destination);     //Вершину, ближайшую к точку назначения

        var closed = new List <Vector3>();      //Список пройденных вершин

        if (orig == null || dest == null)
        {
            throw new ArithmeticException();
        }

        var first = new RouteElem(orig, 0, destination, null);

        heap.Add(first);                                                    //Добавляем стартовый элемент в хипу

        while (heap.Peek() != null && heap.Peek().Vert.Coord != dest.Coord) //Пока есть что смотреть и пока не дошли до точки назначения
        //heap.PrintArr();
        //Console.WriteLine("\n");
        {
            var current = heap.Pop();   //Достаем наиболее оптимальную вершину

            //while(In(closed,current.Vert.Coord))
            //    current = heap.Pop();

            //Console.WriteLine("Selected: "+current.Vert.Coord+" H:"+current.H+" F:"+current.F);
            //heap.Remove(current);
            //Console.Write("Popped: " + current.ToString()+"\n");
            //heap.PrintArr();
            //Console.WriteLine("\n");
            foreach (var vert in current.Vert.AdjacentVertices())  //Проверяем все смежные вершины
            //var condition = closed.Find(v => CompareVectors(v,vert.Coord)==0);
            {
                if (!In(closed, vert.Coord))                                                                                           //Если вершина не была еще рассмотрена //Vector3 camparing. TODO: check
                {
                    var tmp = new RouteElem(vert, current.G + Vector3.Distance(current.Vert.Coord, vert.Coord), destination, current); //Добавляем ее в хипу
                    heap.Add(tmp);                                                                                                     //TODO: OPTIMIZE -> AddRange() - only 1 balance
                }
            }
            //heap.Sort();
            //list.Reverse();
            closed.Add(current.Vert.Coord); //Добавляем рассматриваемую вершину в список пройденных
        }
        //путь
        // Console.WriteLine("found");

        Debug.LogWarning("CLOSED: " + closed.Count);

        if (heap.Peek() == null)             //Хипа пустая <==> путь не найден
        {
            return(new List <Vector3>());    //Пустой список
        }
        var last = heap.Peek();
        var path = new List <Vector3>();

        var currElem = last;

        while (currElem.PrevElem != null)
        {
            path.Add(currElem.Vert.Coord);
            currElem = currElem.PrevElem;
        }
        path.Add(currElem.Vert.Coord);

        path.Reverse();
        return(path);

        //throw new NotImplementedException();
    }
Ejemplo n.º 3
0
    /**
     * A* algorithm. Returns an empty list if there is no path.
     * Returns a List, where the last element is the closest vertex to the destination point.
     *
     * @param origin
     * @param destination
     */
    public List <Vector3> FindRoute(Vector3 origin, Vector3 destination)
    {
        var open = new MinHeap <RouteElem>();   //Хипа вместо приоритетой очереди
        var orig = FindVertex(origin);          //Находим вершину старт
        var dest = FindVertex(destination);     //Вершину, ближайшую к точку назначения

        var closed = new List <Vector3>();      //Список пройденных вершин

        if (orig == null || dest == null)
        {
            throw new ArithmeticException();
        }

        var first = new RouteElem(orig, 0, destination, null);

        open.Add(first); //Добавляем стартовый элемент в хипу

        RouteElem current = null;

        while (!open.IsEmpty())
        {
            current = open.Pop();   //Достаем наиболее оптимальную вершину
            var x = current.Vert;

            if (In(closed, x.Coord))
            {
                continue;
            }
            if (x.Coord == dest.Coord)
            {
                break; //return path
            }
            closed.Add(x.Coord);

            foreach (var vert in current.Vert.AdjacentVertices())  //Проверяем все смежные вершины
            //var condition = closed.Find(v => CompareVectors(v,vert.Coord)==0);
            {
                if (!In(closed, vert.Coord))                                                                                           //Если вершина не была еще рассмотрена //Vector3 camparing. TODO: check
                {
                    var tmp = new RouteElem(vert, current.G + Vector3.Distance(current.Vert.Coord, vert.Coord), destination, current); //Добавляем ее в хипу
                    open.Add(tmp);                                                                                                     //TODO: OPTIMIZE -> AddRange() - only 1 balance
                }
            }
        }
        //путь
        // Console.WriteLine("found");


        //if(current == null)//open.Peek() == null)             //Хипа пустая <==> путь не найден
        //    return new List<Vector3>();     //Пустой список

        if ((int)current.Vert.Coord.x == 0 && (int)current.Vert.Coord.z == 0 && (int)destination.x != 0 && (int)destination.z != 0)
        {
            return(new List <Vector3>());
        }

        var last = current;//open.Peek();
        var path = new List <Vector3>();

        var currElem = last;

        while (currElem.PrevElem != null)
        {
            path.Add(currElem.Vert.Coord);
            currElem = currElem.PrevElem;
        }
        path.Add(currElem.Vert.Coord);

        path.Reverse();
        return(path);

        //throw new NotImplementedException();
    }