¿Cuál es un buen algoritmo para generar un archipiélago en un mapa en particular?

El ruido de Perlin es una técnica utilizada para generar terrenos aleatorios. Por ejemplo, los grupos en el terreno aleatorio a continuación podrían pasar como un archipiélago.

Ken Perlin’s A Webwide World , interactivo en línea en http://mrl.nyu.edu/~perlin/exper…, http://mrl.nyu.edu/~perlin/planet/

La génesis del trabajo anterior de Perlin son las Falsificaciones Fractales Aleatorias de Robert Voss [1, 2]. El programa Linux ppmforge implementa las ideas de estos documentos y puede generar planetas de acuerdo con diferentes parámetros del terreno. La página del manual para ppmforge ofrece una lista completa.

Marcel Gagné, Cooking with Linux: el arte no es más que una realidad diseñada , [3] Generado con ppmforge -hour 10.5 -glaciers .5 -tilt 23.5 -ice .5 -width 800 -height 600

Los generadores de terreno funcionan asignando una altura a cada punto en una superficie. Esa altura es típicamente un número entre 0 y 1, donde 0 es la “profundidad del océano” y 1 es “la cima de la montaña más alta”. Una técnica para obtener más islas es aplicar un filtro a los valores de altura que empujan la tierra más baja. Un filtro de energía puede hacer eso [4].

* Editar: otra técnica sería mezclar una máscara dibujada a mano con terreno aleatorio. La máscara definiría un límite duro para el terreno como un cortador de galletas, que cuando se aplica al terreno aleatorio hará que el resultado final tenga la forma del terreno. Un video que usa esta técnica está en [5].

[1] Voss, Richard F., “Random Fractal Forgeries”, en Earnshaw et. al., Algoritmos fundamentales para gráficos por computadora, Berlín: Springer-Verlag, 1985.

[2] Peitgen, H.-O. y Saupe, D. eds., The Science Of Fractal Images, Nueva York: Springer Verlag, 1988.

[3] http://dl.acm.org/citation.cfm?i…

[4] http://www.gamedev.net/page/reso…

[5]

[Esta pregunta se ha descuidado durante un mes, es tarde y estoy aburrida, así que voy a intentarlo basándose en mi conocimiento y experiencia de generación procesal bastante limitada. Proporcione mejores soluciones si estoy fuera de la base.]

Existen muchos algoritmos interesantes para generar contenido procesal en el caso general. Terragen, WorldBuilder y otros programas comerciales están respaldados por algoritmos que pueden volverse bastante sofisticados. Sin embargo, si está intentando hacer algo específico por su cuenta (como generar un archipiélago), no debería ser difícil intentar piratear algo rápidamente utilizando una combinación básica de otros algoritmos:

Algunos enfoques procesales que existen:

El conjunto exacto de algoritmos que use dependerá de cuán detallado desee que sea su terreno y de si debe ser visible desde 2D (de arriba hacia abajo o posiblemente isométrico) o 3D (de modo que desee “volar” a cualquier lugar) .

Pero tratemos el caso simple de una serie de islas ininterrumpidas internamente (por lo que no hay cuevas, túneles, etc.) Creo que podemos descomponer esto de manera segura en múltiples subproblemas:

  1. Definir los límites de algunas islas.
  2. Alisarlos si es necesario
  3. Dar a las islas mapas de altura
  4. Aplicar texturas a las islas.

Para el paso (1), podemos usar una especie de caminata aleatoria para definir una isla singular en el océano. Ver: http://en.wikipedia.org/wiki/Ran… . Tendremos que aplicar algún tipo de suavizado porque nuestra caminata aleatoria podría haber dejado “agujeros” o pequeñas irregularidades en la isla (ver ejemplos en la página de Wikipedia). Por supuesto, estaríamos lidiando con una noción muy binaria de “tierra” para comenzar, por ejemplo, el océano sería blanco y cualquier píxel de “tierra” sería negro.

Para generar múltiples islas aleatorias, podemos agregar un parámetro de ‘teletransportación’; es decir, hay, por ejemplo, una probabilidad de 0.00005% de que su partícula que camina aleatoriamente se teletransporte a otro lugar en su mapa en cualquier iteración dada. Puede definir un límite de teletransportación para que las posibilidades de que esté demasiado lejos de su posición existente sean casi nulas (piense en una distribución de probabilidad de electrones aquí).

Para el paso (2) – suavizado – supongamos que tomamos una ventana deslizante de un tamaño apropiado fijo (por ejemplo, 4 × 4) y la movemos por el mapa. Podríamos intentar definir una función básica de mapeo que modifique la cuadrícula. Algo como esto podría funcionar como un comienzo:

  • Si hay un píxel o dos solitarios en el “centro” de la ventana, elimínelo
  • Si se rellenan todos (o la mayoría, para alguna definición de la mayoría) de los píxeles en los ‘bordes’ de la ventana, complete toda la ventana.

Para el paso (3), el ruido Perlin funcionaría para generar un mapa de altura. Puede generar el ruido para toda la cuadrícula en una pasada y luego superponerlo en su caminata aleatoria de teletransportación suavizada.

Para el paso (4), ahora que tiene esencialmente un terreno tridimensional y (con suerte) un montón de islas, puede aplicar el algoritmo de generación de textura que desee. Como ya tiene una rutina de ruido Perlin, ¿por qué no volver a aplicarla?

O use fractales. O usa wavelets. O use diagramas de Voronoi. O usa cualquier otra cosa.

More Interesting

Informática: ¿Por qué la recursión es más elegante que la iteración?

¿Cuáles son las diferencias entre los algoritmos que realizan la búsqueda en un gráfico y los algoritmos que realizan la búsqueda en un árbol?

¿Debería considerar C ++ sobre Python para las entrevistas de Silicon Valley?

¿Cómo puede un algoritmo RLS utilizar el filtro Wiener como bloque FIR (M-tap)?

Soy nuevo en Quora y no entiendo si las preguntas de coeficiente intelectual son una tendencia constante o si estoy atrapado en alguna forma de algoritmo infernal. Si es así, ¿cómo escapo?

¿Puede crear un puntero 2D dinámico que almacene elementos ingresados ​​por el usuario como una matriz y lo muestre antes y después de liberarlo?

¿Hay algún campo de arranque en EE. UU. Que se centre en C ++ y algoritmos?

Cómo mejorar las estructuras de datos y algoritmos

¿Qué algoritmo se usa para detectar "No más interruptores posibles, barajar" en la saga Candy Crush?

Estoy tomando un curso en línea, Algorithms Part 1 de Sedgewick y Wayne en Coursera. Conozco bastante a Java, pero me llevó más de un día llegar a la mitad de la resolución de la primera tarea de programación. ¿Debería dejarlo? ¿Todos sienten lo mismo mientras aprenden sobre algoritmos?

¿Cuál es la forma correcta de leer CLRS (Introducción a los algoritmos)?

¿Qué algoritmos se utilizan para el proceso de aprendizaje automático de Yandex?

¿Por qué mi código JavaScript muestra un error de bucle infinito en la línea 7? ¿Por qué no está eliminando los elementos de la matriz de entrada?

Al explorar un museo, ¿es mejor usar BFS o DFS?

Si podemos ordenar datos usando SQL, ¿por qué necesitamos estudiar diferentes algoritmos de ordenación?