En este mapa, el "continente" es toda la tierra que se puede conectar al centro del mapa en las cuatro direcciones cardinales (norte, sur, este, oeste, no en diagonal).
Me gustaría detectar el continente y llenar los agujeros en él. Pensé en tres cosas:
Busque en cada celda que no sea de agua (celdas oscuras) si se puede conectar al centro del mapa utilizando un algoritmo de búsqueda de ruta. ¡Muy caro! Pero esto podría funcionar para las islas.
El continente está lleno de un cubo de pintura verde. Cada hoyo está rodeado de pintura ... ¿y ahora qué? Si verifico la adyacencia de cada punto de agua dentro del continente, eliminaré algunas penínsulas y otras características geográficas que se muestran en la costa.
Algún tipo de detección de bordes para descubrir el continente. Mantenga lo que esté adentro, llénelo si es agua, retire lo que está afuera. ¿Complejo?
¿Quizás algún desarrollador experimentado del juego pueda ayudarme con esto, posiblemente dándome el nombre de algún algoritmo o técnica conocida?
Respuestas:
Eliminando islas
He hecho este tipo de cosas antes en uno de mis juegos. Para deshacerse de las islas exteriores, el proceso fue básicamente:
Eliminar lagos
En cuanto a deshacerse de los agujeros (o lagos) dentro de la isla, se realiza un proceso similar pero desde las esquinas del mapa y se extiende a través de los mosaicos de "Agua". Esto le permitirá distinguir el "Mar" de las otras baldosas de agua, y luego podrá deshacerse de ellas tal como lo hizo antes con las islas.
Ejemplo
Permítanme desenterrar mi implementación del relleno de inundación que tengo aquí en algún lugar (descargo de responsabilidad, no me importaba la eficiencia, así que estoy seguro de que hay muchas formas más eficientes de implementarlo):
Usé esto como un primer paso para deshacerme de los lagos en mi juego. Después de llamar a eso, todo lo que tenía que hacer era algo como:
Editar
Agregar información adicional basada en los comentarios. En caso de que su espacio de búsqueda sea demasiado grande, puede experimentar un desbordamiento de pila al usar la versión recursiva del algoritmo. Aquí hay un enlace en stackoverflow (juego de palabras :-)) a una versión no recursiva del algoritmo, usando en su
Stack<T>
lugar (también en C # para que coincida con mi respuesta, pero debería ser fácil de adaptar a otros idiomas, y hay otras implementaciones en eso enlace también).fuente
Modifique el algoritmo de relleno de inundación de cuatro direcciones http://en.wikipedia.org/wiki/Flood_fill
fuente
Esta es una operación estándar en el procesamiento de imágenes. Utiliza una operación de dos fases.
Comience creando una copia del mapa. Desde este mapa, convierta en píxeles marinos todos los píxeles terrestres que bordean el mar. Si hace esto una vez, eliminará las islas 2x2 y reducirá las islas más grandes. Si lo haces dos veces, eliminará las islas 4x4, etc.
En la fase dos, usted hace casi lo contrario: convierte en píxeles terrestres todos los píxeles marinos que bordean la tierra, pero solo si eran píxeles terrestres en el mapa original (es por eso que hizo una copia en la fase 1). Esto hace que las islas vuelvan a su forma original, a menos que se eliminen por completo en la fase 1.
fuente
Tuve un problema similar pero no en el desarrollo del juego. Tenía que encontrar píxeles en una imagen adyacentes entre sí y con el mismo valor (regiones conectadas). Intenté usar un relleno de inundación recursivo pero seguí causando desbordamientos de pila (soy un programador novato: P). Luego probé este método http://en.wikipedia.org/wiki/Connected-component_labeling, en realidad era mucho más eficiente, para mi problema de todos modos.
fuente