private int [,,] brushFire(Queue <ItemMapaDistancias> cola, int [,,] mapa) { while (cola.Count > 0) { ItemMapaDistancias actual = cola.Dequeue(); ItemMapaDistancias[] siguientes = siguienteCeldas(actual); foreach (ItemMapaDistancias item_dis in siguientes) { int pos_x = item_dis.x + (ancho / 2); int pos_z = item_dis.z + (largo / 2); //Esta dentro de nuestro array if (pos_x >= 0 && pos_z >= 0 && pos_x <= ancho && pos_z <= largo) { if (array_mapa_obstaculos [pos_x, pos_z, 0] == Constantes._LIBRE) //Si es obstaculo no hace falta calcular nada { if (mapa [pos_x, pos_z, 0] > item_dis.distancia) //Si es mayor es que hemos enconstrado un obstaculo mas cercano { mapa [pos_x, pos_z, 0] = item_dis.distancia; cola.Enqueue(item_dis); } } } } } return(mapa); }
private ItemMapaDistancias[] siguienteCeldas(ItemMapaDistancias actual) { ItemMapaDistancias [] siguientes = new ItemMapaDistancias[8] { new ItemMapaDistancias(), new ItemMapaDistancias(), new ItemMapaDistancias(), new ItemMapaDistancias(), new ItemMapaDistancias(), new ItemMapaDistancias(), new ItemMapaDistancias(), new ItemMapaDistancias() }; ItemMapaDistancias[] movimientos = new ItemMapaDistancias[8] { new ItemMapaDistancias(0, 0, 1, 10), // adelante new ItemMapaDistancias(-1, 0, 1, 14), // adelante izquierda new ItemMapaDistancias(-1, 0, 0, 10), // izquierda new ItemMapaDistancias(-1, 0, -1, 14), // atras izquierda new ItemMapaDistancias(0, 0, -1, 10), // atras new ItemMapaDistancias(1, 0, -1, 14), // atras derecha new ItemMapaDistancias(1, 0, 0, 10), // derecha new ItemMapaDistancias(1, 0, 1, 14) // adelante derecha }; int indice = 0; foreach (ItemMapaDistancias item_sig in movimientos) { siguientes [indice].x = actual.x + item_sig.x; siguientes [indice].y = actual.y + item_sig.y; siguientes [indice].z = actual.z + item_sig.z; siguientes [indice].distancia = actual.distancia + item_sig.distancia; indice++; } return(siguientes); }
private int[,,] crearMapaHeuristicaObstaculos() { int [,,] mapa_heuristica_obstaculos = new int[ancho + 1, largo + 1, 1]; Queue <ItemMapaDistancias> cola = new Queue <ItemMapaDistancias> (); //mapa.setRadio (0.5f); //int inicio_ancho = (ancho / 2) * (-1); //int inicio_largo = (largo / 2) * (-1); //rellenamos el mapa antes de empezar for (int i = 0; i <= ancho; i++) { for (int j = 0; j <= largo; j++) { mapa_heuristica_obstaculos [i, j, 0] = int.MaxValue; } } int x_meta = Mathf.RoundToInt(vector_meta.x + (ancho / 2)); int z_meta = Mathf.RoundToInt(vector_meta.z + (largo / 2)); mapa_heuristica_obstaculos [x_meta, z_meta, 0] = 0; ItemMapaDistancias celda_meta = new ItemMapaDistancias(); celda_meta.x = x_meta - (ancho / 2); celda_meta.y = 0; celda_meta.z = z_meta - (largo / 2); celda_meta.distancia = 0; cola.Enqueue(celda_meta); brushFire(cola, mapa_heuristica_obstaculos); return(mapa_heuristica_obstaculos); }
private int[,,] crearMapaDistancias() { int [,,] mapa_distancias = new int[ancho + 1, largo + 1, 1]; Queue <ItemMapaDistancias> cola = new Queue <ItemMapaDistancias> (); mapa.setRadio(0.5f); //int inicio_ancho = (ancho / 2) * (-1); //int inicio_largo = (largo / 2) * (-1); //rellenamos el mapa antes de empezar for (int i = 0; i <= ancho; i++) { for (int j = 0; j <= largo; j++) { mapa_distancias [i, j, 0] = int.MaxValue; if (array_mapa_obstaculos [i, j, 0] == Constantes._OBSTACULO) { ItemMapaDistancias celda = new ItemMapaDistancias(); mapa_distancias [i, j, 0] = 0; celda.x = i - (ancho / 2); celda.y = 0; celda.z = j - (largo / 2); celda.distancia = 0; cola.Enqueue(celda); } } } brushFire(cola, mapa_distancias); return(mapa_distancias); }