예제 #1
0
        /// <summary>
        /// Calcula con el algoritmo A* el camino entre el inicio y la meta en el mapa proporcionado
        /// </summary>
        /// <param name="inicio">Coordenada de inicio</param>
        /// <param name="meta">Coordenada de llegada</param>
        /// <param name="movimientoDiagonal">Indica si se permite el movimiento lateral</param>
        /// <param name="movimientoOrtogonal"></param>
        /// <param name="mapa">Mapa en el que se ejecuta el algoritmo</param>
        /// <param name="wayPoints">Puntos intermedios por los que hay que pasar en orden</param>
        /// <returns>Objeto Resultado con el camino y el coste.</returns>
        public static AEstrellaResultado CalculoAEstrella(Baldosa inicio, Baldosa meta, bool movimientoDiagonal,
                                                          bool movimientoOrtogonal, Baldosa[,] mapa, params Baldosa[] wayPoints)
        {
            var resultado = new AEstrellaResultado(new List <Baldosa>(), 0);
            var puntos    = new Baldosa[wayPoints.Length + 2];

            var i = 0;

            puntos[i++] = inicio;
            for (; i <= wayPoints.Length; i++)
            {
                puntos[i] = wayPoints[i - 1];
            }

            puntos[i] = meta;

            i = 1;
            for (; i < puntos.Length; i++)
            {
                var aEstrella = new AEstrella(puntos[i - 1], puntos[i], movimientoDiagonal, movimientoOrtogonal,
                                              mapa);
                var parcial = aEstrella.Algoritmo();
                if (parcial.Camino == null)
                {
                    return(new AEstrellaResultado(mapa, null, 0.0));
                }

                resultado.Coste += parcial.Coste;
                resultado.Camino.AddRange(parcial.Camino);
                aEstrella.LimpiarListas(resultado.Camino);
            }

            return(resultado);
        }
예제 #2
0
        /// <summary>
        /// Genera el camino resultado
        /// </summary>
        /// <param name="resultadoAlgoritmo">Punto donde acabael algoritmo</param>
        /// <param name="resultado">Objeto resultado</param>
        protected static void TratarCaminoResultado(Baldosa resultadoAlgoritmo, AEstrellaResultado resultado)
        {
            Baldosa actual = resultadoAlgoritmo;

            while (actual != null)
            {
                resultado.Camino.Add(actual);
                actual = actual.Padre;
            }

            resultado.Camino.Reverse();
        }
예제 #3
0
        /// <summary>
        /// Trata y genera la solución del algoritmo
        /// </summary>
        /// <param name="resultadoAlgoritmo">Punto del mapa al que se llega</param>
        /// <returns>Objeto con el camino y el coste asociado</returns>
        protected AEstrellaResultado ProcesarResultado(Baldosa resultadoAlgoritmo)
        {
            AEstrellaResultado resultado;

            if (resultadoAlgoritmo == null)
            {
                resultado = new AEstrellaResultado(Mapa, null, 0.0);
            }
            else
            {
                resultado = new AEstrellaResultado(Mapa, new List <Baldosa>(), resultadoAlgoritmo.F);
                TratarCaminoResultado(resultadoAlgoritmo, resultado);
            }

            return(resultado);
        }