//Algoritmo A* Nodo crearRecorrido(Vector2 posicion, PuntoRecorrido[] fin) { //Creamos las colas frontera y descubiertos(esta ultima no requeriria de cola con prioridad). ColaNodos frontera = new ColaNodos(); frontera.IntroducirNodosEnCruz(posicion, fin); ColaNodos descubiertos = new ColaNodos(); do { //Quita el nodo de la frontera y lo evalua Nodo aux = frontera.Primero(); frontera.QuitarNodo(); //si es el objetivo ha encontrado el objetivo if (aux.este.EstaEstePuntoEn(fin)) { return(aux); } //Lo anyade a los nodos descubiertos descubiertos.IntroducirNodo(aux); //Expande los hijos Nodo[] auxs = aux.Hijos(fin); //Evalua cada hijo for (int i = 0; i < auxs.Length; i++) { //Si ya ha sido descubierto lo ignora if (!descubiertos.EstaElNodo(auxs[i])) { Nodo auxc = auxs[i]; //si no esta en frontera y su estimacion es menor que el anterior lo sustituye if (auxc.f > auxs[i].f) { frontera.QuitarNodo(auxc); frontera.IntroducirNodo(auxs[i]); } else { //En caso contrario lo introduce. frontera.IntroducirNodo(auxs[i]); } } } //Si la frontera se queda vacia no hay solucion. } while (frontera.Primero() != null); return(null); }
void Iniciar() { conQueColisiona = LayerMask.GetMask("Obstaculos", "Recorrido"); //Busca todos los nodos del grafo. GameObject[] auxiliar = GameObject.FindGameObjectsWithTag("Path"); puntosTotales = new PuntoRecorrido[auxiliar.Length]; for (int i = 0; i < puntosTotales.Length; i++) { puntosTotales[i] = auxiliar[i].GetComponent <PuntoRecorrido>(); } ReiniciarRed(); Nodo a = new Nodo(null, puntosTotales[0], null, 0, 0); ColaNodos cola = new ColaNodos(a); for (int i = 1; i < puntosTotales.Length; i++) { cola.IntroducirNodo(new Nodo(null, puntosTotales[i], null, 0, 0)); } }