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);
    }
示例#3
0
    // 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);
    }
示例#5
0
    // 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());
        }
    }
示例#6
0
    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);
    }