private NodePath RunDijkstra(DefinitionNodeGrid definitionNodeGrid, Point2 gridStart, Point2 gridEnd, out bool succes)
        {
            var dijkstraAlgorithm = new DijkstraAlgorithm(definitionNodeGrid.NodeCount);

            var start = definitionNodeGrid.NodeGrid.ToIndex(gridStart.X, gridStart.Y);
            var end   = definitionNodeGrid.NodeGrid.ToIndex(gridEnd.X, gridEnd.Y);

            var pathfindingNetwork = new DijkstraNodeGrid(definitionNodeGrid, 5);
            var pathRequest        = PathRequest.Create(Substitute.For <IPathfinder <IPath> >(), start, end, PathfindaxCollisionCategory.Cat1);

            return(dijkstraAlgorithm.FindPath(pathfindingNetwork, pathRequest, out succes));
        }
Esempio n. 2
0
        public void TestDijkstra()
        {
            var vertices = new int[] { 1, 2, 3, 4, 5, 6 };
            var edges = new int[,]
            {
                { -1, 7, 9, -1, -1, 14 },
                { 7, -1, 10, 15, -1, -1 },
                { 8, 10, -1, 11, -1, 2 },
                { -1, 15, 11, -1, 6, -1 },
                { -1, -1, -1, 6, -1, 9 },
                { 14, -1, 2, -1, 9, -1}
            };

            var dijkstra = new DijkstraAlgorithm<int>(vertices, edges);
            var path = dijkstra.FindPath(0, 4);
            CollectionAssert.AreEqual(path, new int[] { 1, 3, 6, 5 });
        }
Esempio n. 3
0
        public void TestDijkstra()
        {
            var vertices = new int[] { 1, 2, 3, 4, 5, 6 };
            var edges    = new int[, ]
            {
                { -1, 7, 9, -1, -1, 14 },
                { 7, -1, 10, 15, -1, -1 },
                { 8, 10, -1, 11, -1, 2 },
                { -1, 15, 11, -1, 6, -1 },
                { -1, -1, -1, 6, -1, 9 },
                { 14, -1, 2, -1, 9, -1 }
            };

            var dijkstra = new DijkstraAlgorithm <int>(vertices, edges);
            var path     = dijkstra.FindPath(0, 4);

            CollectionAssert.AreEqual(path, new int[] { 1, 3, 6, 5 });
        }
Esempio n. 4
0
 public bool FindPath()
 {
     _algorithm.StartFindPath(_nodeNetwork, _definitionNodeGrid.NodeArray, _pathRequest.PathStart);
     return(_algorithm.FindPath(_nodeNetwork, _definitionNodeGrid.NodeGrid.Array, _pathRequest.PathEnd, _pathRequest.AgentSize, _pathRequest.CollisionCategory));
 }
Esempio n. 5
0
        private void Run()
        {
            Defaults.Load();

            MeasureTime(() =>
            {
                Console.WriteLine("Reading network file...");
                _streets = OsmStreetSystem.LoadSystem("K:\\OsmData\\schleswig-holstein-latest.sn");
                Console.WriteLine("Finished.");
            });

            GC.Collect();

            var start = _streets.Waypoints[3444465853];
            var end   = _streets.Waypoints[620793260];

            Console.WriteLine();
            Console.WriteLine($"Trying to find path from {start.Id} to {end.Id}");
            Console.WriteLine($"Direct distance: {start.DistanceTo(end):##.000} km");

            Console.WriteLine();
            Console.WriteLine("Using Dijkstra's allgorithm.");
            var dijkstra = new DijkstraAlgorithm();
            var astar    = new AStarAlgorithm();

            Console.WriteLine(" --------- DIJKSTRA ----------");

            for (int i = 0; i < 3; i++)
            {
                MeasureTime(() =>
                {
                    Console.WriteLine($"[{i}] Looking for a path in the graph....");
                    var p = dijkstra.FindPath(start, end);

                    Console.WriteLine($"Finished in {dijkstra.Steps} steps.");
                    Console.WriteLine($"Inspected {dijkstra.InspectedNodes}, visited {dijkstra.VisitedNodes}");

                    if (p != null)
                    {
                        Console.WriteLine($"Found a path. {p.Waypoints.Count} waypoints. {p.Length:##.000} km.");
                    }
                    else
                    {
                        Console.WriteLine("No path found.");
                    }
                });
            }

            Console.WriteLine(" --------- A-STAR ----------");
            for (int i = 0; i < 3; i++)
            {
                MeasureTime(() =>
                {
                    Console.WriteLine($"[{i}] Looking for a path in the graph....");
                    var p = astar.FindPath(start, end);

                    Console.WriteLine($"Finished in {astar.Steps} steps.");
                    Console.WriteLine($"Inspected {astar.InspectedNodes}, visited {astar.VisitedNodes}");

                    if (p != null)
                    {
                        Console.WriteLine($"Found a path. {p.Waypoints.Count} waypoints. {p.Length:##.000} km.");
                    }
                    else
                    {
                        Console.WriteLine("No path found.");
                    }
                });
            }

            Console.ReadLine();
        }
    IEnumerator GenerateLevel()
    {
        while (!loaded)
        {
            if (gX * gY > 1)
            {
                InitializeGrid(gX, gY);
                yield return(null);

                int r1Q = Random.Range(1, 4);
                int r2Q = Random.Range(1, 4);
                if (r1Q == r2Q)
                {
                    r2Q++;
                    if (r2Q == 5)
                    {
                        r2Q = 1;
                    }
                }
                bool r1Assigned = false;
                do
                {
                    r1Assigned = AssignRandomRoom(1, r1Q);
                } while (!r1Assigned);
                bool r2Assigned = false;
                do
                {
                    r2Assigned = AssignRandomRoom(2, r2Q);
                } while (!r2Assigned);
                end.occupied = false;
                yield return(null);

                for (int i = 0; i < gX; i++)
                {
                    for (int j = 0; j < gY; j++)
                    {
                        grid [i, j].weight = Random.Range(0, 50);
                    }
                }
                yield return(null);

                start.weight = 0;
                path         = DijkstraAlgorithm.FindPath(start, end, grid, gX, gY);
                roomsToPlace = new List <Arrangement> (0);
                List <Node> pathOrig = new List <Node> (0);
                foreach (Node n in path)
                {
                    pathOrig.Add(n);
                }
                for (int i = 0; i < pathOrig.Count - 1; i++)
                {
                    if (path.Contains(pathOrig [i]))
                    {
                        if (roomsToPlace.Count == 0)
                        {
                            roomsToPlace.Add(PlaceRoom(path [0], Arrangement.pathFailure, true));
                        }
                        roomsToPlace.Add(PlaceRoom(path [0], roomsToPlace [roomsToPlace.Count - 1].pathExitPt, true));
                        yield return(null);
                    }
                }
                roomsToPlace.Add(PlaceRoom(end, roomsToPlace [roomsToPlace.Count - 1].pathExitPt, false));
                yield return(null);

                InstantiateRooms(roomsToPlace);
                yield return(null);

                roomsToPlace.Clear();
                for (int i = 0; i < sideRooms; i++)
                {
                    if (openDoors.Count > 0)
                    {
                        DoorInfo door = openDoors [Random.Range(0, openDoors.Count)];
                        if (InBounds((int)door.loc.x, (int)door.loc.y))
                        {
                            Arrangement r = PlaceRoom(grid [(int)(door.loc.x), (int)(door.loc.y)], door.loc - door.face, false);
                            if (r != null)
                            {
                                roomsToPlace.Add(r);
                                InstantiateRooms(roomsToPlace);
                                roomsToPlace.Clear();
                            }
                            else
                            {
                                openDoors.Remove(door);
                                i--;
                            }
                            yield return(null);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                RemoveExcessNavmesh();
                DoorInfo[] dGrp = FindObjectsOfType <DoorInfo> ();
                for (int i = dGrp.Length - 1; i >= 0; i--)
                {
                    if (dGrp [i].pair != null)
                    {
                        dGrp [i].pair.GetComponent <RoomInfo> ().AddToNeighborList(dGrp [i].gameObject);
                        dGrp [i].GetComponent <RoomInfo> ().AddToNeighborList(dGrp [i].pair.gameObject);
                        if (!dGrp [i].MarkForRemoval)
                        {
                            if (!dGrp [i].locked)
                            {
                                dGrp [i].PlaceDoorObject(unlockedDoor, gridScale);
                            }
                        }
                        yield return(null);
                    }
                    else
                    {
                        dGrp [i].PlaceDoorObject(sealedDoor, gridScale);
                    }
                }
                for (int i = dGrp.Length - 1; i >= 0; i--)
                {
                    if (dGrp [i].MarkForRemoval)
                    {
                        Destroy(dGrp [i]);
                    }
                }
            }
            GameObject[]      Hpickups = GameObject.FindGameObjectsWithTag("Health");
            GameObject[]      Apickups = GameObject.FindGameObjectsWithTag("Ammo");
            List <GameObject> picks    = new List <GameObject> ();
            foreach (GameObject g in Hpickups)
            {
                picks.Add(g);
            }
            foreach (GameObject g in Apickups)
            {
                picks.Add(g);
            }
            for (int i = 0; i < 3; i++)
            {
                if (picks.Count < 1)
                {
                    break;
                }
                GameObject lockboxPos = picks [Random.Range(0, picks.Count)];
                GameObject lockbox    = Instantiate(lockBoxObj);
                lockbox.transform.position = lockboxPos.transform.position;
                picks.Remove(lockboxPos);
                Destroy(lockboxPos);
            }
            for (int i = 0; i < 3; i++)
            {
                if (picks.Count < 1)
                {
                    break;
                }
                GameObject lockpickPos = picks [Random.Range(0, picks.Count)];
                GameObject lockpick    = Instantiate(lockPickObj);
                lockpick.transform.position = lockpickPos.transform.position;
                picks.Remove(lockpickPos);
                Destroy(lockpickPos);
            }
            loaded = true;
        }
        StopCoroutine(GenerateLevel());
    }
    IEnumerator GenerateLevel()
    {
        while (!loaded)
        {
            if (gX * gY > 1)
            {
                InitializeGrid(gX, gY);
                yield return(null);

                int r1Q = Random.Range(1, 4);
                int r2Q = Random.Range(1, 4);
                if (r1Q == r2Q)
                {
                    r2Q++;
                    if (r2Q == 5)
                    {
                        r2Q = 1;
                    }
                }
                bool r1Assigned = false;
                do
                {
                    r1Assigned = AssignRandomRoom(1, r1Q);
                } while (!r1Assigned);
                bool r2Assigned = false;
                do
                {
                    r2Assigned = AssignRandomRoom(2, r2Q);
                } while (!r2Assigned);
                end.occupied = false;
                yield return(null);

                for (int i = 0; i < gX; i++)
                {
                    for (int j = 0; j < gY; j++)
                    {
                        grid [i, j].weight = Random.Range(0, 50);
                    }
                }
                yield return(null);

                start.weight = 0;
                path         = DijkstraAlgorithm.FindPath(start, end, grid, gX, gY);
                roomsToPlace = new List <Arrangement> (0);
                List <Node> pathOrig = new List <Node> (0);
                foreach (Node n in path)
                {
                    pathOrig.Add(n);
                }
                for (int i = 0; i < pathOrig.Count - 1; i++)
                {
                    if (path.Contains(pathOrig [i]))
                    {
                        if (roomsToPlace.Count == 0)
                        {
                            roomsToPlace.Add(PlaceRoom(path [0], Arrangement.pathFailure, true));
                        }
                        roomsToPlace.Add(PlaceRoom(path [0], roomsToPlace [roomsToPlace.Count - 1].pathExitPt, true));
                        yield return(null);
                    }
                }
                roomsToPlace.Add(PlaceRoom(end, roomsToPlace [roomsToPlace.Count - 1].pathExitPt, false));
                yield return(null);

                InstantiateRooms(roomsToPlace);
                yield return(null);

                roomsToPlace.Clear();
                bool rLAssigned = false;
                Node lockRoom;
                if (openDoors.Count > 0)
                {
                    do
                    {
                        lockRoom = grid[Random.Range(0, gX), Random.Range(0, gY)];
                        if (!lockRoom.occupied)
                        {
                            rLAssigned = true;
                        }
                    } while (!rLAssigned);
                    lockRoom.weight   = 0;
                    lockRoom.roomType = 3;
                    DoorInfo d        = openDoors [Random.Range(0, openDoors.Count)];
                    Node     hallRoom = grid[(int)d.loc.x, (int)d.loc.y];
                    path         = DijkstraAlgorithm.FindPath(hallRoom, lockRoom, grid, gX, gY);
                    roomsToPlace = new List <Arrangement> (0);
                    pathOrig     = new List <Node> (0);
                    foreach (Node n in path)
                    {
                        pathOrig.Add(n);
                    }
                    for (int i = 0; i < pathOrig.Count - 1; i++)
                    {
                        if (path.Contains(pathOrig [i]))
                        {
                            if (roomsToPlace.Count == 0)
                            {
                                roomsToPlace.Add(PlaceRoom(path [0], Arrangement.pathFailure, true));
                            }
                            roomsToPlace.Add(PlaceRoom(path [0], roomsToPlace [roomsToPlace.Count - 1].pathExitPt, true));
                            yield return(null);
                        }
                    }
                    roomsToPlace.Add(PlaceRoom(lockRoom, roomsToPlace [roomsToPlace.Count - 1].pathExitPt, false));
                    yield return(null);

                    InstantiateRooms(roomsToPlace);
                    yield return(null);

                    roomsToPlace.Clear();
                }
                for (int i = 0; i < sideRooms; i++)
                {
                    if (openDoors.Count > 0)
                    {
                        DoorInfo door = openDoors [Random.Range(0, openDoors.Count)];
                        if (InBounds((int)door.loc.x, (int)door.loc.y))
                        {
                            Arrangement r = PlaceRoom(grid [(int)(door.loc.x), (int)(door.loc.y)], door.loc - door.face, false);
                            if (r != null)
                            {
                                roomsToPlace.Add(r);
                                InstantiateRooms(roomsToPlace);
                                roomsToPlace.Clear();
                            }
                            else
                            {
                                openDoors.Remove(door);
                                i--;
                            }
                            yield return(null);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                RemoveExcessNavmesh();
                DoorInfo[] dGrp = FindObjectsOfType <DoorInfo> ();
                for (int i = dGrp.Length - 1; i >= 0; i--)
                {
                    if (dGrp [i].pair != null && dGrp[i] != null)
                    {
                        dGrp [i].pair.GetComponent <RoomInfo> ().AddToNeighborList(dGrp [i].gameObject);
                        dGrp [i].GetComponent <RoomInfo> ().AddToNeighborList(dGrp [i].pair.gameObject);
                        if (!dGrp [i].MarkForRemoval)
                        {
                            if (!dGrp[i].locked)
                            {
                                dGrp [i].PlaceDoorObject(unlockedDoor, gridScale);
                            }
                            else
                            {
                                dGrp [i].PlaceDoorObject(lockedDoor, gridScale);
                            }
                        }
                        yield return(null);
                    }
                }
                for (int i = dGrp.Length - 1; i >= 0; i--)
                {
                    if (dGrp [i].MarkForRemoval)
                    {
                        Destroy(dGrp [i]);
                    }
                }
            }
            loaded = true;
        }
        StopCoroutine(GenerateLevel());
    }