public Itineraire chemin(Pt_cle dep, Pt_cle arr) { List <Itineraire> listIti; // lorsque que les 2 points sont dans le même couloir if (compareList(dep.getCouloir().getNoeudsVoisin(), arr.getCouloir().getNoeudsVoisin()) == false) { List <ListNoeud> listList; listList = rechercheItiNoeud(dep, arr); for (int i = 0; i < listList.Count; i++) { listIti.Add(generationIti(listList[i], dep, arr)); } } else { Itineraire iti = new Itineraire(); List <CaseCouloir> listCase = generationList(dep.getCouloir(), arr.getCouloir()); listCase.Add(arr.getCouloir()); for (int j = 0; j < listCase.Count; j++) { iti.addCase(listCase[j]); } listIti.Add(iti); } iti = itiFinal(listIti); return(iti); }
// la méthode génère une liste de CaseCouloir avec l'aide de la liste des CaseNoeud public Itineraire generationIti(ListNoeud listN, Pt_cle dep, Pt_cle arr) { int lig, col; Itineraire iti = new Itineraire(); List <CaseCouloir> liste = new List <CaseCouloir>(); // liste contenant la case départ jusqu'au premier noeud liste = generationList(dep.getCouloir(), listN[0]); for (int i = 0; i < liste.Count; i++) { iti.addCase(liste[i]); } // boucle pour rajouter toutes les CaseCouloir qui sont entre les CaseNoeud for (int j = 1; j < listN; j++) { liste = generationList(listN[j - 1], listN[j]); for (int k = 0; k < liste.Count; k++) { iti.addCase(liste[k]); } } // ajout des CaseCouloir entre le dernier noeud et le point d'arrivée liste = generationList(listN[listN.Count - 1], arr.getCouloir()); for (int l = 0; l < liste.Count; l++) { iti.addCase(liste[l]); } // ajout du point d'arrivée iti.addCase(arr.getCouloir()); return(iti); }
// méthode qui va chercher tout les itinéraires possibles pour les noeuds public List <ListNoeud> rechercheItiNoeud(Pt_cle depart, Pt_cle arrivee) { // contient liste de tous les itinéraires possibles List <ListNoeud> listeList = new List <ListNoeud>(); List <CaseNoeud> listCaseNoeudDep = depart.getNoeudsVoisin(); List <CaseNoeud> listCaseNoeudAr = arrivee.getNoeudsVoisin(); // taille de la liste de noeud de la case départ, on suppose que dans tous les cas la valeur est toujours de 2, chaque couloir 2 noeuds int n = listCaseNoeudDep.Count; // nombre d'éléments dans la liste des listes int m = 0; // création de liste selon le nombre de noeuds de départ // ajout de ces listes dans la liste des listes for (int i = 0; i < n; i++) { ListNoeud liste = new ListNoeud(); liste.getListe().Add(listCaseNoeudDep[i]); listeList.Add(liste); m = listeList.Count; } // boolean vérifiant sur les derniers éléments sont ceux de la destination Boolean check; // acquisition des différents itinéraires de noeuds possibles while (check == false) { // // liste de transition List <ListNoeud> listeTran = new List <ListNoeud>(); for (int i = 0; i < listeList.Count; i++) { // liste qui contient les caseNoeuds de 1 itinéraire ListNoeud liste = listeList[i]; // vérifie si la liste est terminé if (liste.getStatus() == false) { // t: index du dernier élément de la liste en cours int t = liste.getListe().Count; CaseNoeud c = liste.getListe()[t - 1]; // prends en liste les voisins du dernier point List <CaseNoeud> voisins = c.getNoeudsVoisin(); // boucle qui va considérer chaque voisin et va les ajouter à la liste s'il correspond aux critères // critère: différents des case départs et des caseNoeuds déjà contenus dans la liste for (int j = 0; j < voisins.Count; j++) { // dupplication de la liste en cours pour pouvoir ajouter les nouveaux itinéraires possibles ListeNoeud temp = liste; // case qui est voisin CaseNoeud v = voisins[j]; // si la CaseNoeud n'est pas dans la liste et parmi les CaseNoeud de départ if ((temp.Contains(v) == false) && (listCaseNoeudDep.Contains(v) == false)) { // ajout de l'élément dans la liste temp.addNoeud(v); // si la dernière caseNoeud est l'arrivée alors if (listCaseNoeudAr.Contains(v) == true) { temp.setStatut(true); } // ajout de la nouvelle liste créée listeTran.Add(temp); } } } else { // ajout de la liste terminé listeTran.Add(liste); } } // la liste des listes est mise à jour listeList = listeTran; check = true; // si 1 seul élément n'est pas fini alors la boucle continue for (int l = 0; l < listeList.Count; l++) { if (listeList[l].getStatus() == false) { check = false; } } } // méthode qui verifie si tous les ititnéraires possibles arrivent à destination return(listeList); }