public void lineaVisionTest() { ObtenerMapa mapa = new ObtenerMapa(); bool comprobar; Vector3 posicion1; Vector3 posicion2; mapa.setRadio(0.5f); posicion1 = new Vector3(45.0f, 0.0f, 0.0f); posicion2 = new Vector3(0.0f, 0.0f, 0.0f); comprobar = mapa.lineaVision(posicion1, posicion2); Assert.IsFalse(comprobar, "7) No deberia haber linea de vision."); posicion1 = new Vector3(45.0f, 0.0f, 40.0f); posicion2 = new Vector3(-31.0f, 0.0f, -25.0f); comprobar = mapa.lineaVision(posicion1, posicion2); Assert.IsFalse(comprobar, "8) No deberia haber linea de vision."); posicion1 = new Vector3(-45.0f, 0.0f, -40.0f); posicion2 = new Vector3(-4.0f, 0.0f, -38.0f); comprobar = mapa.lineaVision(posicion1, posicion2); Assert.IsFalse(comprobar, "9) No deberia haber linea de vision."); posicion1 = new Vector3(-45.0f, 0.0f, 45.0f); posicion2 = new Vector3(45.0f, 0.0f, 45.0f); comprobar = mapa.lineaVision(posicion1, posicion2); Assert.IsTrue(comprobar, "9) No deberia haber obstaculos en el camino."); posicion1 = new Vector3(45.0f, 0.0f, 0.0f); posicion2 = new Vector3(45.0f, 0.0f, 40.0f); comprobar = mapa.lineaVision(posicion1, posicion2); Assert.IsTrue(comprobar, "10) No deberia haber obstaculos en el camino."); }
protected override List <Nodo> CalcularSucesores(Nodo n_actual, Vector3 meta, ObtenerMapa mapa) { List <Nodo> sucesores = new List <Nodo> (); foreach (Vector3 vector in vertices) { // La version comprobando las linea de vision en los dos sentidos no funciona bien con los vertices // porque no encuentra los mejores caminos //if (mapa.lineaVision (n_actual.vector, vector) && mapa.lineaVision (vector, n_actual.vector)) { if (mapa.lineaVision(n_actual.vector, vector)) { Nodo nuevo_sucesor = new Nodo(); nuevo_sucesor.vector = vector; nuevo_sucesor.padre = n_actual; nuevo_sucesor.costeG = funcionG(nuevo_sucesor); nuevo_sucesor.costeH = funcionH(nuevo_sucesor, meta); nuevo_sucesor.coste = (peso * nuevo_sucesor.costeG) + nuevo_sucesor.costeH; sucesores.Add(nuevo_sucesor); } } return(sucesores); }
// comprueba que los posibles sucesores esten dentro del rango posible protected override List <Nodo> SucesoresValidos(Nodo[] sucesor, ObtenerMapa mapa) { List <Nodo> sucesores = new List <Nodo> (); foreach (Nodo sucesor_valido in sucesor) { if (mapa.lineaVision(sucesor_valido.padre.vector_hybrid, sucesor_valido.vector_hybrid)) { sucesores.Add(sucesor_valido); } } return(sucesores); }
// comprueba que los posibles sucesores esten dentro del rango posible protected virtual List <Nodo> SucesoresValidos(Nodo[] sucesor, ObtenerMapa mapa) { List <Nodo> sucesores = new List <Nodo> (); foreach (Nodo sucesor_valido in sucesor) { //Comprobamos las dos direcciones porque hemos encontrado que no siempre, aunque deberia, da el mismo resultado //Asi evitamos bugs debido a que sea visible/alcanzable desde una direccion pero no desde la otra if (mapa.lineaVision(sucesor_valido.padre.vector, sucesor_valido.vector) && mapa.lineaVision(sucesor_valido.vector, sucesor_valido.padre.vector)) { //if ( mapa.lineaVision (sucesor_valido.padre.vector, sucesor_valido.vector)){ sucesores.Add(sucesor_valido); } } return(sucesores); }
// Para usar un algorutmo u otro // Inicializacion void Start() { int tam_parrilla; GameObject suelo; error = false; encontrada_meta = false; suelo = GameObject.FindGameObjectWithTag("Suelo"); largo = Mathf.FloorToInt((suelo.transform.localScale.z * 10.0f)); ancho = Mathf.FloorToInt((suelo.transform.localScale.x * 10.0f)); tam_parrilla = ancho * largo; parrilla = new Parrilla(casilla_abiertos, casilla_cerrados, ancho, largo, z_casilla_distancias_0, z_casilla_distancias_1, z_casilla_distancias_2, z_casilla_distancias_3, z_casilla_distancias_4, z_casilla_distancias_5, z_casilla_distancias_6); mapa = new ObtenerMapa(); coche = GameObject.FindGameObjectWithTag("Coche"); //rb_coche = coche.GetComponent<Rigidbody> (); frontal = GameObject.FindGameObjectWithTag("Frontal"); trasera = GameObject.FindGameObjectWithTag("Trasera"); salida_trasera = trasera.transform.position; salida_frontal = frontal.transform.position; salida_coche = coche.transform.position; // Elegir algoritmo if (a_hybrid_a_estrella) { Debug.Log("Usando Hybrid A Estrella"); script_algoritmo = new Hybrid_a_estrella(); salida_coche = salida_frontal; if (mapa.lineaVision(salida_coche, salida_frontal)) //no hace falta salir hacia atras { salida_coche = salida_frontal; } else if (mapa.lineaVision(salida_coche, salida_trasera)) //salir hacia atras { salida_coche = salida_trasera; } } else if (a_A_estrella) { Debug.Log("Usando A Estrella"); script_algoritmo = new A_estrella(); } else if (a_A_estrella_vertices) { Debug.Log("Usando A Estrella con vertices"); script_algoritmo = new A_estrella_vertices(); } else if (a_theta_estrella) { Debug.Log("Usando Theta Estrella"); script_algoritmo = new Theta_estrella(); } meta = GameObject.FindGameObjectWithTag("Meta").transform.position; meta.y = meta.y - 0.01f; // Esto es porque esta posicionada elevada por motivos esteticos angulo_coche = coche.transform.rotation.eulerAngles.y; parrilla.Ancho = ancho; parrilla.Largo = largo; Debug.Log("Ancho: " + ancho + " | largo: " + largo); encontrada_meta = false; inicio = Time.realtimeSinceStartup; script_algoritmo.iniciarCalcularRuta(salida_coche, meta, angulo_coche, mapa, parrilla, a_param_peso_heuristica, tam_parrilla, ancho, largo, a_dibujar_casillas); if (a_dibujar_mapa_obstaculos) { dibujarMapaObstaculos(script_algoritmo.getMapaObstaculos()); } else if (a_dibujar_mapa_distancias) { dibujarMapaDistancias(script_algoritmo.getMapaDistancias()); } }
public Vector3 [] eliminarZigZag(Vector3[] p_trayectoria) { int size_trayectoria = p_trayectoria.Length; LinkedList <Vector3> nueva = new LinkedList <Vector3> (); Vector3 actual; Vector3 siguiente; Vector3 visible; int i = 2; actual = p_trayectoria [0]; visible = p_trayectoria [1]; siguiente = p_trayectoria [2]; //actual = p_trayectoria [size_trayectoria-1]; //visible = p_trayectoria [size_trayectoria-2]; //siguiente = p_trayectoria [size_trayectoria-3]; //i = size_trayectoria - 3; nueva.AddLast(actual); while (i < size_trayectoria) { //while ( i >= 0 ) { siguiente = p_trayectoria [i]; if (mapa.lineaVision(actual, siguiente)) { visible = siguiente; i++; //i--; } else { if (visible == actual) { actual = siguiente; visible = siguiente; nueva.AddLast(siguiente); i++; } else { nueva.AddLast(visible); actual = visible; } } } nueva.AddLast(siguiente); Vector3[] temp = new Vector3[nueva.Count]; i = 0; foreach (Vector3 vector in nueva) { temp [i] = vector; i++; } return(temp); }