public void HybridAEstrellaMapaDistancias()
    {
        AlgoritmoRuta hybrid = new Hybrid_a_estrella();
        GameObject    coche  = GameObject.FindGameObjectWithTag("Coche");

        Vector3     inicio   = new Vector3(20.0f, 0.0f, 0.0f);
        Vector3     meta     = new Vector3(0.0f, 0.0f, 0.0f);
        float       angulo   = coche.transform.rotation.eulerAngles.y;
        ObtenerMapa mapa     = new ObtenerMapa();
        Parrilla    parrilla = new Parrilla(new GameObject(), new GameObject());

        hybrid.iniciarCalcularRuta(inicio, meta, angulo, mapa, parrilla, 0.0f, 100 * 100, 100, 100, false);

        int[,,] m_obstaculos = hybrid.getMapaDistancias();

        /*
         * Hay obstaculos en:
         * 0, 0 ,0
         * -31, -0, 25
         * 27, 0, 30
         *
         * No hay en:
         * 0,0, 45
         * 0,0, -45
         *
         * hay que pasarlos a indices sumandoles la mitad del ancho (50)
         */

        Assert.IsTrue(m_obstaculos [50, 50, 0] == 0, "9) Es obstaculos la distancia debia ser 0, y es " + m_obstaculos [50, 50, 0]);
        Assert.IsTrue(m_obstaculos[19, 75, 0] == 0, "10) Es obstaculos la distancia debia ser 0, y es " + m_obstaculos [19, 75, 0]);
        Assert.IsTrue(m_obstaculos[57, 80, 0] == 0, "11) Es obstaculos la distancia debia ser 0, y es " + m_obstaculos [57, 80, 0]);

        Assert.IsTrue(m_obstaculos[50, 95, 0] == 30, "12) La distancia debia ser 30, y es " + m_obstaculos [50, 95, 0]);
        Assert.IsTrue(m_obstaculos[50, 5, 0] == 10, "13) La distancia debia ser 10, y es " + m_obstaculos [50, 5, 0]);
    }
예제 #2
0
    public void aEstrellaVerticesHayRutaTest()
    {
        AlgoritmoRuta astar_vertices = new A_estrella_vertices();
        GameObject    coche          = GameObject.FindGameObjectWithTag("Coche");

        Vector3     inicio   = new Vector3(44.0f, 0.0f, 0.0f);
        Vector3     meta     = new Vector3(44.0f, 0.0f, 10.0f);
        float       angulo   = coche.transform.rotation.eulerAngles.y;
        ObtenerMapa mapa     = new ObtenerMapa();
        Parrilla    parrilla = new Parrilla(new GameObject(), new GameObject());

        Vector3[] trayectoria;
        bool      error = false;

        astar_vertices.iniciarCalcularRuta(inicio, meta, angulo, mapa, parrilla, 1.0f, 100 * 100, 100, 100, false);

        while (!astar_vertices.pasoCalcularRuta(out error) && !error)
        {
        }

        Assert.IsFalse(error, "1) No ha encontrado una ruta");

        trayectoria = astar_vertices.getTrayectoria();

        Assert.IsTrue(trayectoria [trayectoria.Length - 1] == meta, "2) No ha llegado a la meta. Es " + trayectoria [trayectoria.Length - 1] + " y debia ser " + meta);
    }
    public void HybridAEstrellaTestsHayRutaTest()
    {
        AlgoritmoRuta hybrid = new Hybrid_a_estrella();
        GameObject    coche  = GameObject.FindGameObjectWithTag("Coche");

        Vector3     inicio   = new Vector3(44.0f, 0.0f, 0.0f);
        Vector3     meta     = new Vector3(44.0f, 0.0f, 10.0f);
        float       angulo   = coche.transform.rotation.eulerAngles.y;
        ObtenerMapa mapa     = new ObtenerMapa();
        Parrilla    parrilla = new Parrilla(new GameObject(), new GameObject());

        Nodo[] trayectoria;
        bool   error = false;

        hybrid.iniciarCalcularRuta(inicio, meta, angulo, mapa, parrilla, 0.0f, 100 * 100, 100, 100, false);

        while (!hybrid.pasoCalcularRuta(out error) && !error)
        {
        }

        Assert.IsFalse(error, "1) No ha encontrado una ruta");

        trayectoria = hybrid.getTrayectoriaNodos();
        float distancia = Vector3.Distance(trayectoria [trayectoria.Length - 1].vector_hybrid, meta);

        Assert.IsTrue(distancia < 2, "2) No ha llegado a la meta. Es " + trayectoria [trayectoria.Length - 1].vector_hybrid + " y debia ser " + meta);
    }
    public void HybridAEstrellaMapaObstaculosTest()
    {
        AlgoritmoRuta hybrid = new Hybrid_a_estrella();
        GameObject    coche  = GameObject.FindGameObjectWithTag("Coche");

        Vector3     inicio   = new Vector3(20.0f, 0.0f, 0.0f);
        Vector3     meta     = new Vector3(0.0f, 0.0f, 0.0f);
        float       angulo   = coche.transform.rotation.eulerAngles.y;
        ObtenerMapa mapa     = new ObtenerMapa();
        Parrilla    parrilla = new Parrilla(new GameObject(), new GameObject());

        hybrid.iniciarCalcularRuta(inicio, meta, angulo, mapa, parrilla, 0.0f, 100 * 100, 100, 100, false);

        int[,,] m_obstaculos = hybrid.getMapaObstaculos();

        /*
         * Hay obstaculos en:
         * 0, 0 ,0
         * -31, -0, 25
         * 27, 0, 30
         *
         * No hay en:
         * 0,0, 45
         * 0,0, -45
         *
         * hay que pasarlos a indices sumandoles la mitad del ancho (50)
         */

        Assert.IsTrue(m_obstaculos [50, 50, 0] == Constantes._OBSTACULO, "4) No hay obstaculo pero debia haberlo");
        Assert.IsTrue(m_obstaculos[19, 75, 0] == Constantes._OBSTACULO, "5) No hay obstaculo pero debia haberlo");
        Assert.IsTrue(m_obstaculos[57, 80, 0] == Constantes._OBSTACULO, "6) No hay obstaculo pero debia haberlo");

        Assert.IsTrue(m_obstaculos[50, 95, 0] == Constantes._LIBRE, "7) No es espacio libre pero debia serlo");
        Assert.IsTrue(m_obstaculos[50, 5, 0] == Constantes._LIBRE, "8) No es espacio libre pero debia serlo");
    }
    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);
    }
예제 #6
0
    public void aEstrellaVerticesNoRutaTest()
    {
        AlgoritmoRuta astar_vertices = new A_estrella_vertices();
        GameObject    coche          = GameObject.FindGameObjectWithTag("Coche");

        Vector3     inicio   = new Vector3(20.0f, 0.0f, 0.0f);
        Vector3     meta     = new Vector3(0.0f, 0.0f, 0.0f);
        float       angulo   = coche.transform.rotation.eulerAngles.y;
        ObtenerMapa mapa     = new ObtenerMapa();
        Parrilla    parrilla = new Parrilla(new GameObject(), new GameObject());

        bool error = false;

        astar_vertices.iniciarCalcularRuta(inicio, meta, angulo, mapa, parrilla, 1.0f, 100 * 100, 100, 100, false);

        while (!astar_vertices.pasoCalcularRuta(out error) && !error)
        {
        }

        Assert.IsTrue(error, "3) No ha devuelto error cuando no hay ruta");
    }
예제 #7
0
    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);
    }
예제 #8
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());
        }
    }
    // A*
    public override Vector3[] CalcularRuta(Vector3 inicio, Vector3 meta, float v_angulo_coche, ObtenerMapa mapa, Parrilla parrilla, float p_peso, int tam_parrilla, int ancho, int largo, bool v_dibujar_casillas)
    {
        bool error;

        peso = p_peso;

        iniciarCalcularRuta(inicio, meta, v_angulo_coche, mapa, parrilla, peso, tam_parrilla, ancho, largo, v_dibujar_casillas);

        while (!pasoCalcularRuta(out error))
        {
        }

        return(v_trayectoria);
    }
    public void setParrilla(Parrilla p_parrilla)
    {
        parrilla = p_parrilla;

        parrilla.crearCasilla(trayectoria[punto_actual].vector_hybrid, 0);
    }
 public abstract 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 dibujar_casillas);
 public abstract Vector3[] CalcularRuta(Vector3 inicio, Vector3 meta, float v_angulo_coche, ObtenerMapa mapa, Parrilla parrilla, float p_peso, int tam_parrilla, int ancho, int largo, bool dibujar_casillas);