/// <summary> /// Constructeur de copie. Le chemin (s'il existe) n'est cependant pas copier mais sera /// de toute façon automatiquement reconstruit au besoin. /// </summary> /// <param name="grille">Grille à recopier dans this.</param> public PFGrille(PFGrille grille) { this.Monde = grille.Monde; // Copier les noeuds de grille dans ceux de this. for (int row = 0; row < this.NombreRangees; row++) { for (int col = 0; col < this.NombreColonnes; col++) { this.grille[row, col].Franchissable = grille[row, col].Franchissable; } } // Déterminer les noeuds de départ et de destination (s'ils existent). try { this.Depart = grille.Depart; this.Destination = grille.Destination; } catch (NullReferenceException) { this.depart = this.destination = null; } }
/// <summary> /// Fonction retournant une liste des noeuds franchissables adjacents à celui donné en paramètre. /// Les huit noeuds adjacents sont considérés: /// +-----------+ /// | 1 | 2 | 3 | Les noeuds 2, 4, 5 et 7 sont validés uniquement s'ils sont franchissables. /// |---+---+---| /// | 4 | | 5 | Les noeuds en diagonal (1, 3, 6 et 8) sont validés s'ils sont /// |---+---+---| franchissables et que leurs deux noeuds adjacents le sont aussi. Par exemple /// | 6 | 7 | 8 | le noeud 6 est valide si les noeuds 4, 6 et 7 sont franchissables. /// +-----------+ /// </summary> /// <param name="noeud">Noeud dont on doit déterminer les noeuds adjacents franchissables.</param> /// <returns>Liste des noeuds franchissables adjacents au noeud fourni en paramètre.</returns> private List<PFNoeud> NoeudsVoisinsFranchissables(PFNoeud noeud) { // Liste où stocker les voisins franchissables. List<PFNoeud> liste = new List<PFNoeud>(); // Valider le noeud adjacent #2. if (noeud.Rangee > 0) { if (this.grille[noeud.Rangee - 1, noeud.Colonne].Franchissable) { // Noeud adjacent #2 valide. liste.Add(this.grille[noeud.Rangee - 1, noeud.Colonne]); } } // Valider le noeud adjacent #7. if (noeud.Rangee < this.NombreRangees - 1) { if (this.grille[noeud.Rangee + 1, noeud.Colonne].Franchissable) { // Noeud adjacent #7 valide. liste.Add(this.grille[noeud.Rangee + 1, noeud.Colonne]); } } // Valider le noeud adjacent #4. if (noeud.Colonne > 0) { if (this.grille[noeud.Rangee, noeud.Colonne - 1].Franchissable) { // Noeud adjacent #4 valide. liste.Add(this.grille[noeud.Rangee, noeud.Colonne - 1]); } } // Valider le noeud adjacent #5. if (noeud.Colonne < this.NombreColonnes - 1) { if (this.grille[noeud.Rangee, noeud.Colonne + 1].Franchissable) { // Noeud adjacent #5 valide. liste.Add(this.grille[noeud.Rangee, noeud.Colonne + 1]); } } // Valider le noeud adjacent #1. if (noeud.Rangee > 0 && noeud.Colonne > 0) { if (this.grille[noeud.Rangee - 1, noeud.Colonne].Franchissable && this.grille[noeud.Rangee, noeud.Colonne - 1].Franchissable && this.grille[noeud.Rangee - 1, noeud.Colonne - 1].Franchissable) { // Noeud adjacent #1 valide. liste.Add(this.grille[noeud.Rangee - 1, noeud.Colonne - 1]); } } // Valider le noeud adjacent #3. if (noeud.Rangee > 0 && noeud.Colonne < this.NombreColonnes - 1) { if (this.grille[noeud.Rangee - 1, noeud.Colonne].Franchissable && this.grille[noeud.Rangee, noeud.Colonne + 1].Franchissable && this.grille[noeud.Rangee - 1, noeud.Colonne + 1].Franchissable) { // Noeud adjacent #3 valide. liste.Add(this.grille[noeud.Rangee - 1, noeud.Colonne + 1]); } } // Valider le noeud adjacent #6. if (noeud.Rangee < this.NombreRangees - 1 && noeud.Colonne > 0) { if (this.grille[noeud.Rangee + 1, noeud.Colonne].Franchissable && this.grille[noeud.Rangee, noeud.Colonne - 1].Franchissable && this.grille[noeud.Rangee + 1, noeud.Colonne - 1].Franchissable) { // Noeud adjacent #6 valide. liste.Add(this.grille[noeud.Rangee + 1, noeud.Colonne - 1]); } } // Valider le noeud adjacent #8. if (noeud.Rangee < this.NombreRangees - 1 && noeud.Colonne < this.NombreColonnes - 1) { if (this.grille[noeud.Rangee + 1, noeud.Colonne].Franchissable && this.grille[noeud.Rangee, noeud.Colonne + 1].Franchissable && this.grille[noeud.Rangee + 1, noeud.Colonne + 1].Franchissable) { // Noeud adjacent #8 valide. liste.Add(this.grille[noeud.Rangee + 1, noeud.Colonne + 1]); } } return liste; }
/// <summary> /// Constructeur paramétré initialisant les attributs de this. Les étiquettes H et G sont /// initialisés à 0, et la tuile correspondant au noeud est considérée comme franchissable. /// </summary> /// <param name="r">Rangée (dans le monde) de la tuile associée au noeud.</param> /// <param name="c">Colonne (dans le monde) de la tuile associée au noeud.</param> /// <param name="pos">Coordonnées (dans le monde) du pixel au centre de la tuile associée au noeud.</param> public PFNoeud(int r, int c, Vector2 pos) { this.h = this.g = 0; this.parent = null; this.rangee = r; this.colonne = c; this.positionTuile = pos; this.franchissable = true; }