Las noticias de diciembre del
huracán Florence a menudo se referían a los
bajíos externos , una serie de islas de barrera frente a la costa de Carolina del Norte:
Las islas de barrera son zonas planas o cuadradas de arena formadas por olas y olas paralelas a la costa del continente. A menudo toman la forma de largas cadenas que pueden estirarse por muchas decenas de millas. Las islas de barrera generalmente están separadas por pequeños canales de marea y pueden formar lagunas entre las islas y el continente.
Según
Wikipedia , las islas de barrera pueden cubrir hasta el 15% de la costa, por lo que puede esperar verlas en la mayoría de los mapas de fantasía, pero de hecho son bastante raros. Y debido a la naturaleza del ruido, casi nunca ocurren en mapas generados por procedimientos que usan ruido para crear terreno.
Para entender por qué esto es así, echemos un vistazo al mapa vainilla de la isla:
De hecho, es un círculo distorsionado por una pequeña cantidad de ruido de baja frecuencia agregado para dividir una forma circular. Ahora tratemos de usar el ruido para romper la costa y formar islas costeras. Aquí está la misma isla con la adición de ruido de baja frecuencia:
Cuenta con bahías y capas. Los elementos de relieve son bastante grandes porque utilicé ruido de baja frecuencia, que cambia lentamente. Sin embargo, el ruido no es lo suficientemente fuerte como para crear islas. Vamos a empujarlo un poco:
Ahora hemos creado varias islas, pero son esencialmente puntos circulares, que no necesariamente se extienden a lo largo de la costa. Puede agregar ruido de alta frecuencia:
Esto puede darnos costas muy rotas y pequeñas islas a lo largo de la costa, pero nada parecido a una isla barrera.
La única razón para esto es que el ruido no coincide en x e y, por lo tanto, aunque el ruido no es aleatorio en general, las formas que crea son aleatorias:
Para algunas cosas, esto es bueno, pero no es adecuado para crear una forma específica, por ejemplo, islas a lo largo de la costa.
Como en otros casos, cuando necesitaba generar una determinada forma o área, era necesario crear una máscara de la forma requerida y luego usar el ruido dentro de la máscara. (También puede usar el ruido para distorsionar la máscara y darle una forma más natural). Las islas de barrera son, de hecho, áreas largas y delgadas que están desviadas de la costa. Entonces, creemos una máscara de esta forma.
Para empezar, establecemos la parte de la costa en la que se ubicará la isla barrera. Esto se puede hacer seleccionando un punto aleatorio en la costa y un segundo punto inferior, que están marcados en la figura con una línea roja en la esquina superior derecha:
Para comenzar a crear una isla barrera, puedo tomar una línea recta entre estos dos puntos y proyectarla un poco hacia afuera, hacia el agua. Esto me dará una isla muy recta y de aspecto poco natural, pero puedes distorsionar su forma para ocultarla. El verdadero problema es que la isla no seguirá la costa. Probablemente se verá normal para la mayoría de los tramos directos de la costa, pero parecerá extraño en las costas sinuosas. Es mejor replicar la costa y convertirla en la base de la forma de la isla.
Para hacer esto, necesito crear una copia de la costa y luego proyectarla en el océano perpendicular a la costa. Ya tengo un procedimiento para calcular perpendiculares (normales) a líneas discontinuas desde que me di cuenta de
líneas escritas a mano , y mis costas siempre van en la misma dirección, por lo que es bastante simple:
O
parece simple. Veamos qué sucede si proyecto la costa un poco más hacia afuera (para crear el otro lado de la máscara de la isla) en la parte menos lisa de la costa:
Dos segmentos de la línea proyectada se cruzan entre sí y crean un aterrador "ocho" en el polígono. Este es el llamado
problema de la curva paralela . No podemos simplemente desplazar la costa a cierta distancia, también es necesario resolver los problemas que surgen de las esquinas agudas internas y externas.
Estaba buscando un código Javascript para resolver este problema, pero el único ejemplo encontrado (a
partir de aquí ) fue sorprendente incluso en muestras bastante simples. Entonces escribí el mío. En general, la solución es desplazar cada punto a lo largo de la normalidad, pero luego verificar si el nuevo punto crea una línea que interseque cualquiera de las líneas existentes. Si es así, cortamos el bucle e insertamos una nueva línea que consiste en el punto de intersección y el nuevo punto. En los casos de prueba que probé, este sistema funcionó bastante bien para mis requisitos.
Entonces ahora puedo generar máscaras simples (sin bucles) para las islas:
Esto es demasiado parejo, así que distorsionaré los contornos:
Los contornos pueden tocar la costa en algunos puntos, pero esto es normal; esto a menudo se encuentra en las islas de barrera.
El siguiente paso es llenar el contorno con tierra, pero antes de hacer esto, quiero alargar las islas y agregar la lógica de evitar las islas que se cruzan en caso de crear varias islas de barrera en la misma costa.
Ahora intentemos agregar un poco de tierra. Para hacer esto, elevaré la altura de cualquier ubicación de tierra (que son triángulos de Delaunay) sobre el nivel del mar:
Hay un par de aspectos que vale la pena destacar. En primer lugar, en la esquina superior izquierda hay una isla barrera bastante exitosa. Sin embargo, la isla no parece llenar bien el vertedero. Muchos triángulos terrestres están "encendidos" debido a la presencia de sus centros dentro del polígono. Esto agrega aleatoriedad a la forma de la isla. En segundo lugar, uno puede notar que las otras dos islas estaban tan cerca de la costa que simplemente se fusionaron con ella. Como quiero crear islas aquí, no necesito que esto suceda con demasiada frecuencia, así que configuraré la generación para obtener una mayor brecha de agua entre la costa y la isla. (Más adelante agregaré una marca para evitar que esto suceda).

Una de las cosas buenas de los triángulos irregulares terrestres es que crean naturalmente conductos de marea típicos de las islas de barrera. Lo malo de ellos es que generalmente crean islas de puntos que parecen perlas distorsionadas en una cuerda. No son muy similares a las islas de barrera, y si tomas muchos triángulos individuales, se ven muy poco naturales.
Si aumento el ancho de las islas, ambos efectos desaparecen y obtengo más islas naturales, pero sin canales de marea:
Pero me gustaría aprender a generar islas muy estrechas. Otro enfoque es aumentar (significativamente) el número de ubicaciones en el mundo para aumentar la resolución:
Por lo tanto, podemos obtener islas increíblemente delgadas y detalladas, pero aumenta significativamente el tiempo y la memoria necesarios para crear un mapa.
En ambos métodos, hay una buena posibilidad de que algunas partes de la isla sean muy desiguales:
Esto sucede porque la ruta intersecta los dos lados (y a veces los tres lados) de los triángulos de Delaunay subyacentes. Este es un problema inherente al uso de la triangulación de Delaunay en la generación de mapas, ¡pero por alguna razón rara vez lo discuten! Esto sucede en las costas de mi juego con poca frecuencia, porque para reducir la cantidad de tales casos, agregué deliberadamente una fase de suavizado, pero esta fase tiende a destruir islas estrechas. Una posible solución es crear islas un poco más anchas y usar anti-aliasing: si está configurado correctamente, puede obtener islas más delgadas sin muchos artefactos triangulares:
Sin embargo, con este enfoque, todavía hay limitaciones sobre cuán estrechas pueden ser las islas. Además, esto significa que nunca obtendremos verdaderas costas fractales.
A veces, el algoritmo de suavizado conduce a la división de la isla de barrera larga en varias pequeñas (como en la esquina inferior izquierda de la imagen de arriba), pero sería conveniente tener una opción que le permita hacer esto a la fuerza:
Lo único que queda es dar nombres a las islas y mapearlas. El único aspecto sutil aquí es que no quiero dar nombres a todas las islas en la cadena de islas de barrera. En las cadenas reales de islas de barrera, las islas individuales a menudo tienen nombres, lo que lleva al caos en el mapa:
Por lo tanto, al crear una isla de barrera, tomo en cuenta todo el arco y le asigno un nombre, incluso si, como resultado, la generación divide el arco en varias islas:
Por lo general, las islas de barrera se denominan "bancos" o "ejes" (barras), por lo que estas palabras se encuentran en nombres de variantes.
Este ejemplo muestra un problema potencial de isla barrera:
Aquí se creó la isla barrera dentro de la bahía. Esto es ilógico (además, conduce a la intersección de nombres). Para evitar esto, puedo usar la
lógica de reconocimiento de mis
bahías y omitir estas secciones de la costa. Probablemente no haya protección contra el tonto en este método, pero funciona bien para esta tarjeta: