Beispiel #1
0
    private Transform dijkstra(Transform depart, Transform arrivee)
    {
        Debug.Log("Algorithme Dijkstra");

        List <Transform> inexplores = new List <Transform>();

        // Réinitialise chaque noeud et l'ajoute à la liste des noeuds inexplorés

        foreach (GameObject obj in noeuds)
        {
            Noeud n = obj.GetComponent <Noeud>();
            if (n.isLibre())
            {
                n.reset();
                inexplores.Add(obj.transform);
            }
        }

        // Met le poids du noeud de départ à zéro

        Noeud noeudDepart = depart.GetComponent <Noeud>();

        noeudDepart.setPoids(0);

        // Tant qu'il reste des noeuds dans la liste des inexplorés

        while (inexplores.Count > 0)
        {
            // On prend celui de poids minimum

            inexplores.Sort((x, y) => x.GetComponent <Noeud>().getPoids().CompareTo(y.GetComponent <Noeud>().getPoids()));
            Transform courant = inexplores[0];

            // On l'enlève de la liste

            inexplores.Remove(courant);
            Noeud noeudCourant = courant.GetComponent <Noeud>();

            // On récupère les voisins et on calcul leur poids et leur parent en fonction de notre nouvelle position

            List <Transform> voisins = noeudCourant.getVoisins();

            foreach (Transform noeudVoisin in voisins)
            {
                Noeud noeud = noeudVoisin.GetComponent <Noeud>();
                if (inexplores.Contains(noeudVoisin) && noeud.isLibre())
                {
                    float distance = Vector3.Distance(noeudVoisin.position, courant.position) + noeudCourant.getPoids();
                    if (distance < noeud.getPoids())
                    {
                        noeud.setPoids(distance);
                        noeud.setParent(courant);
                    }
                }
            }
        }
        return(arrivee);
    }