public void countTest() { Cerrados cerrados = new Cerrados(); Assert.IsTrue(cerrados.count() == 0, "11) No es correcto, es " + cerrados.count() + " y debia ser " + 0); Nodo nodo1 = new Nodo(); nodo1.vector = new Vector3(1.0f, 0.0f, 0.0f); nodo1.coste = 10.0f; Nodo nodo2 = new Nodo(); nodo2.vector = new Vector3(2.0f, 0.0f, 0.0f); nodo2.coste = 1.0f; cerrados.add(nodo1); cerrados.add(nodo2); Assert.IsTrue(cerrados.count() == 2, "12) No es correcto, es " + cerrados.count() + " y debia ser " + 2); cerrados.delete(nodo2); Assert.IsTrue(cerrados.count() == 1, "13) No es correcto, es " + cerrados.count() + " y debia ser " + 1); cerrados.delete(nodo1); Assert.IsTrue(cerrados.count() == 0, "14) No es correcto, es " + cerrados.count() + " y debia ser " + 0); }
public void comprobarTest() { Cerrados cerrados = new Cerrados(); Nodo nodo = new Nodo(); nodo.vector = new Vector3(1.0f, 0.0f, 0.0f); nodo.coste = 1.0f; cerrados.add(nodo); bool comprobar = cerrados.comprobar(nodo); Assert.IsTrue(comprobar, "2) No esta el nodo que introducimos"); }
public void dibujarTodas(Abiertos abiertos, Cerrados cerrados) { SortedDictionary <Vector3, Nodo> .Enumerator enu_cerrados = cerrados.GetEnumerator(); borrarTodasCasillas(); while (enu_cerrados.MoveNext()) { crearCasilla(enu_cerrados.Current.Value.vector, Constantes._CERRADOS); } foreach (Nodo n in abiertos) { crearCasilla(n.vector, Constantes._ABIERTOS); } }
public void addNodoTest() { Cerrados cerrados = new Cerrados(); Nodo nodo_comprobar; bool comprobar; Nodo nodo = new Nodo(); nodo.vector = new Vector3(1.0f, 0.0f, 0.0f); nodo.coste = 1.0f; cerrados.add(nodo); comprobar = cerrados.find(nodo, out nodo_comprobar); Assert.IsTrue(comprobar && nodo_comprobar.coste == nodo.coste && nodo_comprobar.vector == nodo.vector, "1) No es el mismo nodo que introducimos"); }
public override void iniciarCalcularRuta(Vector3 v_inicio, Vector3 v_meta, float v_angulo_coche, ObtenerMapa v_mapa, Parrilla v_parrilla, float p_peso, int tam_parrilla, int ancho, int largo, bool v_dibujar_casillas) { Vector3[] array_vertices; dibujar_casillas = v_dibujar_casillas; //cerrados = new Cerrados (ancho, largo); cerrados = new Cerrados(); sucesores = new List <Nodo> (); abiertos = new Abiertos(tam_parrilla, ancho, largo); //abiertos = new Abiertos (tam_parrilla); peso = p_peso; abiertos.getEmpty(); cerrados.getEmpty(); vector_inicio = v_inicio; vector_meta = v_meta; mapa = v_mapa; parrilla = v_parrilla; vertices = new HashSet <Vector3> (); array_vertices = mapa.getVertices(); foreach (Vector3 vertice in array_vertices) { vertices.Add(vertice); } vertices.Add(vector_meta); meta_encontrada = false; nodo_final = null; nodo_actual = null; nodo_inicio = new Nodo(); nodo_inicio.vector = vector_inicio; nodo_inicio.padre = null; nodo_inicio.coste = 0; abiertos.add(nodo_inicio); }
public void deleteTest() { Cerrados cerrados = new Cerrados(); bool comprobar; Nodo nodo = new Nodo(); nodo.vector = new Vector3(1.0f, 0.0f, 0.0f); nodo.coste = 1.0f; cerrados.add(nodo); comprobar = cerrados.comprobar(nodo); Assert.IsTrue(comprobar, "3) No esta el nodo que introducimos"); comprobar = cerrados.delete(nodo); Assert.IsTrue(comprobar, "4) Se ha borrado el nodo"); comprobar = cerrados.comprobar(nodo); Assert.IsFalse(comprobar, "5) No se ha borrado"); }
public void getEmptyTest() { Cerrados cerrados = new Cerrados(); Nodo nodo1 = new Nodo(); nodo1.vector = new Vector3(1.0f, 0.0f, 0.0f); nodo1.coste = 10.0f; Nodo nodo2 = new Nodo(); nodo2.vector = new Vector3(2.0f, 0.0f, 0.0f); nodo2.coste = 5.0f; cerrados.add(nodo1); cerrados.add(nodo2); cerrados.getEmpty(); Assert.IsTrue(cerrados.count() == 0, "16) No esta vacio"); }
public void findNodoTest() { Cerrados cerrados = new Cerrados(); bool comprobar; Nodo comprobar_nodo; Nodo nodo = new Nodo(); nodo.vector = new Vector3(1.0f, 0.0f, 0.0f); nodo.coste = 1.0f; cerrados.add(nodo); comprobar = cerrados.find(nodo, out comprobar_nodo); Assert.IsTrue(comprobar_nodo.coste == nodo.coste && comprobar_nodo.vector == nodo.vector, "6) No es el mismo nodo que introducimos"); Assert.IsTrue(comprobar, "7) No se ha encontrado el nodo que introducimos"); cerrados.delete(nodo); comprobar = cerrados.find(nodo, out comprobar_nodo); Assert.IsNull(comprobar_nodo, "8) No tenia que haber encontrado el nodo"); Assert.IsFalse(comprobar, "9) No tenia que haber encontrado el nodo"); }
IEnumerator Rutina(float delay) { EnUso = true; if (!PrimeraVuelta) { // Evaluar movimientos EvaluaMovimiento(); // Obtener los posibles movimientos PosiblesMovimientos = SeleccionaMovimiento(Fantasmas); // Medir la distancia en todos los posibles movimientos // Obtener las coordenadas de los posibles movimientos MapGenerator.Coordenada[] coordenadas = Mapa.PuedeMoverseA(Posicion, PosiblesMovimientos); // Elegir el más cercano (greedy) int j = -1; float mejor = -1; bool enTunel = Mapa.Tunel.FindAll(p => p.x == Posicion.x && p.y == Posicion.y).Count > 0; if (enTunel) { if (Posicion.x > 16) { j = 2; } else if (Posicion.x < 2) { j = 0; } } int dsegura = 0; List <int> PosiblesMovimientosLibres = new List <int>(); bool elegida = true; for (int i = 0; i < 4; i++) { dsegura = 0; try { if (PosiblesMovimientos[i] && !Utility.IsInList(coordenadas[i], Cerrados)) { //if (!enTunel) //{ Vector3 c = new Vector3(coordenadas[i].x, this.transform.position.y, coordenadas[i].y); foreach (FantasmaManager fantasma in Fantasmas) { try { float val = Utility.ManhattanDistance(c, fantasma.Posicion); if (val <= distanciaSegura) { if (val >= mejor) { mejor = val; PosiblesMovimientosLibres.Add(i); Debug.Log(System.String.Format("Nuevo mejor valor: {0}", val)); } } else { // Elegir posicion aleatoria dsegura++; } } catch (NullReferenceException nre) { Debug.Log("Error al seleccionar movimiento.\n" + nre.Message); } } // } //else //{ // j = Posicion.x <= 2 ? 0 : 2; // if(Posicion.x <= 2) // break; //} } } catch (Exception) { } } // Obtiene movimiento aleatorio si es que la distancia segura // está activada if (dsegura >= Fantasmas.Count) { for (int i = 0; i < 4; i++) { int randomValue = UnityEngine.Random.Range(0, 4); if (PosiblesMovimientos[randomValue]) { j = randomValue; elegida = false; break; } } } else { // Obtiene movimiento válido (totalmente filtrado) ALEATORIO. if (PosiblesMovimientosLibres.Count > 1) { int randomIndex = UnityEngine.Random.Range(0, PosiblesMovimientosLibres.Count); j = PosiblesMovimientosLibres[randomIndex]; } else { j = PosiblesMovimientosLibres[0]; } } // Moverse al seleccinado // Bloquear posición anterior Anterior = Posicion; Cerrados.Add(new MapGenerator.Coordenada((int)Posicion.x, (int)Posicion.y)); MoverA(j); if (Cerrados.Count > 0) { Cerrados.Clear(); } // Repetir } else if (Alcanzado) { Debug.Log("Alcanzado: " + Alcanzado); EnUso = false; } else { PrimeraVuelta = false; Alcanzado = false; delay = 0f; } yield return(new WaitForSeconds(delay)); EnUso = false; }
public override void iniciarCalcularRuta(Vector3 v_inicio, Vector3 v_meta, float v_angulo_coche, ObtenerMapa v_mapa, Parrilla v_parrilla, float p_peso, int tam_parrilla, int v_ancho, int v_largo, bool v_dibujar_casillas) { Vector3[] array_vertices; dibujar_casillas = v_dibujar_casillas; ancho = v_ancho; largo = v_largo; //cerrados = new Cerrados (ancho, largo); cerrados = new Cerrados(); sucesores = new List <Nodo> (); abiertos = new Abiertos(tam_parrilla, ancho, largo); //abiertos = new Abiertos (tam_parrilla); peso = p_peso; abiertos.getEmpty(); cerrados.getEmpty(); vector_inicio = v_inicio; vector_meta = v_meta; mapa = v_mapa; parrilla = v_parrilla; vertices = new HashSet <Vector3> (); array_vertices = mapa.getVertices(); foreach (Vector3 vertice in array_vertices) { vertices.Add(vertice); } vertices.Add(vector_meta); meta_encontrada = false; nodo_final = null; nodo_actual = null; nodo_inicio = new Nodo(); nodo_inicio.vector = vector_inicio; nodo_inicio.vector_hybrid = vector_inicio; nodo_inicio.angulo_hybrid = v_angulo_coche; nodo_inicio.padre = null; nodo_inicio.coste = 0; abiertos.add(nodo_inicio); mapa.setRadio(0.5f); // array_mapa_obstaculos = new int[ancho + 1, largo + 1, 1]; tiempo_inicio = Time.realtimeSinceStartup; crearMapaObstaculos(); tiempo_final = Time.realtimeSinceStartup; Debug.Log("Mapa de obstaculos creado en: " + (tiempo_final - tiempo_inicio) + " segs."); tiempo_inicio = Time.realtimeSinceStartup; array_mapa_distancias = crearMapaDistancias(); tiempo_final = Time.realtimeSinceStartup; Debug.Log("Mapa de Distancias creado en: " + (tiempo_final - tiempo_inicio) + " segs."); tiempo_inicio = Time.realtimeSinceStartup; array_heuristica_obstaculos = crearMapaHeuristicaObstaculos(); tiempo_final = Time.realtimeSinceStartup; Debug.Log("Mapa de heuristica de obstaculos creado en: " + (tiempo_final - tiempo_inicio) + " segs."); radio_giro_rad = ((Constantes.distancia / Constantes.coche_largo) * Mathf.Tan(Mathf.Deg2Rad * Constantes.coche_max_angulo)); radio_giro = Mathf.Rad2Deg * radio_giro_rad; Debug.Log("Radio giro rad: " + radio_giro_rad); Debug.Log("Radio giro: " + radio_giro); }
IEnumerator Rutina(float delay) { EnUso = true; if (Objetivo != null) { if (!PrimeraVuelta) { // Evaluar movimientos EvaluaMovimiento(); // Obtener los posibles movimientos PosiblesMovimientos = SeleccionaMovimiento(Companeros); // Medir la distancia en todos los posibles movimientos // Obtener las coordenadas de los posibles movimientos MapGenerator.Coordenada[] coordenadas = Mapa.PuedeMoverseA(Posicion, PosiblesMovimientos); // Elegir el más cercano (greedy) float mejor = Mapa.mapSize.x * 2 + 1f; Vector3 mejorCoordenada = new Vector3(this.Posicion.x, this.transform.position.y, this.Posicion.y); int j = -1; for (int i = 0; i < 4; i++) { try { if (PosiblesMovimientos[i] && !Utility.IsInList(coordenadas[i], Cerrados)) { Vector3 c = new Vector3(coordenadas[i].x, this.transform.position.y, coordenadas[i].y); float val = Utility.ManhattanDistance(c, Objetivo.Posicion); if (val < mejor) { mejor = val; j = i; mejorCoordenada = c; Debug.Log(System.String.Format("Nuevo mejor valor: {0}", val)); } if (Mathf.Abs(val) <= 1f) { //Alcanzado = true; // Objetivo.Alcanzado = true; Objetivo.setAlcanzadoPor(1); // Alcanzado = Objetivo.AlcanzadoPor >= 2 ? true : false; break; } else { Objetivo.setAlcanzadoPor(-1); } } } catch (Exception) { } } // Moverse al seleccinado // Bloquear posición anterior Anterior = Posicion; Cerrados.Add(new MapGenerator.Coordenada((int)Posicion.x, (int)Posicion.y)); MoverA(j); if (Cerrados.Count >= BloqueoDePosiciones) { Cerrados.RemoveAt(0); } // Repetir } else if (Alcanzado) { Debug.Log("Alcanzado: " + Alcanzado); } else { PrimeraVuelta = false; Cerrados = new List <MapGenerator.Coordenada>(); delay = 0f; } yield return(new WaitForSeconds(delay)); } EnUso = false; }