public void SetGridObject(Vector3 worldPosition, CheminMathias value) { int x, y; GetXY(worldPosition, out x, out y); SetGridObject(x, y, value); }
public void SetGridObject(int x, int y, CheminMathias value) { if (x >= 0 && y > 0 && x < largeur && y < hauteur) { listNode[x, y] = value; } }
private CheminMathias FPlusBas(List <CheminMathias> listeChemin) { /*CheminMathias f_bas = listeChemin[0]; * for(int i = 1; i < listeChemin.Count; i++) * { * if(listeChemin[i].f < f_bas.f) * { * f_bas = listeChemin[i]; * } * } * * //Debug.Log(f_bas.x); * Debug.Log(f_bas.y); * Debug.Log(f_bas.x); * * return f_bas;*/ CheminMathias lowerFCostNode = listeChemin[0]; for (int i = 0; i < listeChemin.Count; i++) { if (listeChemin[i].f < lowerFCostNode.f) { lowerFCostNode = listeChemin[i]; } } Debug.Log(lowerFCostNode.y); Debug.Log(lowerFCostNode.x); return(lowerFCostNode); }
private int CalculerH(CheminMathias pt1, CheminMathias pt2) { int d_x = Mathf.Abs(pt1.x - pt2.x); int d_y = Mathf.Abs(pt1.y - pt2.y); int reste = Mathf.Abs(d_x - d_y); int coutFinal = MOUVEMENT_DIAGONAL * Mathf.Min(d_x, d_y) + MOUVEMENT_SUR_AXE * reste; return(coutFinal); }
//Vérification des cases autour de la case sélectionnée private List <CheminMathias> GetListeVoisins(CheminMathias caseActuelle) { List <CheminMathias> listeVoisins = new List <CheminMathias>(); //Case de gauche if (caseActuelle.x - 1 >= 0) { listeVoisins.Add(GetCase(caseActuelle.x - 1, caseActuelle.y)); if (caseActuelle.y - 1 >= 0) { listeVoisins.Add(GetCase(caseActuelle.x - 1, caseActuelle.y - 1)); } if (caseActuelle.y + 1 < grille.GetHauteur()) { listeVoisins.Add(GetCase(caseActuelle.x - 1, caseActuelle.y + 1)); } } //À droite if (caseActuelle.x + 1 < grille.GetLargueur()) { listeVoisins.Add(GetCase(caseActuelle.x + 1, caseActuelle.y)); if (caseActuelle.y - 1 >= 0) { listeVoisins.Add(GetCase(caseActuelle.x + 1, caseActuelle.y - 1)); } if (caseActuelle.y + 1 < grille.GetHauteur()) { listeVoisins.Add(GetCase(caseActuelle.x + 1, caseActuelle.y + 1)); } } if (caseActuelle.y - 1 >= 0) { listeVoisins.Add(GetCase(caseActuelle.x, caseActuelle.x - 1)); } if (caseActuelle.y + 1 >= grille.GetHauteur()) { listeVoisins.Add(GetCase(caseActuelle.x, caseActuelle.x + 1)); } return(listeVoisins); }
private List <CheminMathias> CalculerChemin(CheminMathias caseFin) { List <CheminMathias> chemin = new List <CheminMathias>(); chemin.Add(caseFin); CheminMathias temp = caseFin; while (temp.casePrecedente != null) { chemin.Add(temp.casePrecedente); temp = temp.casePrecedente; } chemin.Reverse(); return(chemin); }
public List <CheminMathias> Chemin(int debutX, int debutY, int finX, int finY) { //Debug.Log(finX); //Debug.Log(finY); CheminMathias caseDebut = grille.GetGridObject(debutX, debutY); CheminMathias caseFin = grille.GetGridObject(finX, finY); listeOuverte = new List <CheminMathias>() { caseDebut }; listeFermee = new List <CheminMathias>(); for (int x = 0; x < grille.GetLargueur(); x++) { for (int y = 0; y < grille.GetHauteur(); y++) { CheminMathias pathNode = grille.GetGridObject(x, y); pathNode.g = int.MaxValue; pathNode.CalculerF(); pathNode.casePrecedente = null; } } caseDebut.g = 0; caseDebut.h = CalculerH(caseDebut, caseFin); caseDebut.CalculerF(); while (listeOuverte.Count > 0) { CheminMathias caseActuelle = FPlusBas(listeOuverte); if (caseActuelle == caseFin) { return(CalculerChemin(caseFin)); } listeOuverte.Remove(caseActuelle); listeFermee.Add(caseActuelle); foreach (CheminMathias caseVoisine in GetListeVoisins(caseActuelle)) { if (listeFermee.Contains(caseVoisine)) { continue; } //Debug.Log(caseVoisine); int gTemp = caseActuelle.g + CalculerH(caseActuelle, caseVoisine); if (gTemp < caseVoisine.g) { caseVoisine.casePrecedente = caseActuelle; caseVoisine.g = gTemp; caseVoisine.h = CalculerH(caseVoisine, caseFin); caseVoisine.CalculerF(); if (!listeOuverte.Contains(caseVoisine)) { listeOuverte.Add(caseVoisine); } } } } return(null); }