Su trabajo es generar un mapa de altura y mostrarlo como un paisaje voxel proyectado en paralelo. Las reglas son las siguientes:
- El (mapa de altura del) paisaje debe generarse aleatoriamente
- También debe describir cómo funciona el algoritmo que está utilizando, para que todos puedan aprender algo nuevo aquí.
- También debe generar una imagen o mostrar el paisaje generado en la pantalla
- La imagen resultante debe proyectarse paralelamente (por lo tanto, no en perspectiva), y solo puede contener vóxeles (por lo que debe estar hecha de pequeñas cajas)
- Este es un concurso de popularidad, por lo que es posible que desee agregar algunas características adicionales a su programa para obtener más votos positivos.
- El ganador es la respuesta válida más votada 7 días después de la última presentación válida. Todos los envíos válidos deben seguir las reglas, incluida la descripción del algoritmo utilizado. Puede agregar características adicionales que no siguen algunas de las reglas (como agregar un modo de perspectiva), pero en este caso tienen que ser características opcionales (por ejemplo, al desactivarlas, el resultado debe seguir todas las reglas)
- Mi envío no cuenta como válido.
Una imagen de resultado de ejemplo es la siguiente:
Respuestas:
Python2 3D Function Plotter Voxel Edition
Esta es mi entrada en esta competencia:
Como se indica claramente en el título, funciona como un trazador de funciones 3D, pero dado que esta competencia requiere que el terreno se genere aleatoriamente, esta función seno aleatoria
1.5*(math.sin(1/randA*x+randC)+math.sin(1/randB*y+randD))
que depende de 4 variables aleatorias. Esto crea terrenos como este:Por supuesto, podemos reemplazar esta función aleatoria por cualquier función variable 2, por ejemplo,
sin(sqrt((x/2)²+(y/2)²))*3
da este terreno:y
-x*y*e^(-x^2-y^2)
da esto:(las parcelas de la derecha son calculadas por wolfram alpha)
Y mientras lo hacemos, Riemann zeta a lo largo de la franja crítica:
Para las personas que no están familiarizadas con él, como puede ver, estos charcos de agua (que representan los ceros de la función) se encuentran en una línea recta (parte real = 0.5). ¡Si puede probar esto, obtendrá $ 1000000! Ver este enlace.
¡Espero que te guste!
fuente
C #, WPF
He experimentado con una caminata aleatoria , que funciona mejor de lo que esperaba. Comienzo en algún lugar del mapa, camino hacia un mosaico adyacente aleatorio e incremento su valor de altura , luego me muevo al siguiente y así sucesivamente. Esto se repite miles de veces y finalmente conduce a un mapa de altura como este (100 x 100):
Luego, "discretizo" el mapa, reduzco el número de valores a los niveles de altura dados y asigno terreno / color en función de esa altura:
Terrenos similares al archipiélago similares:
Mayor número de pasos aleatorios y niveles de altura para obtener un terreno más montañoso:
Código
Características: Recrea el terreno con un botón. Mostrar terreno 3D y mapa 2D. Zoom (rueda del mouse) y desplazamiento 3D (teclas de flecha). Pero no es muy eficiente, después de todo, esto está escrito exclusivamente en WPF, no en DirectX u OpenGL.
MainWindow.xaml:
MainWindow.xaml.cs
fuente
JavaScript y Crafty.JS, para mejorar mucho
Aquí hay una muestra de salida:
Y aquí está el código (página web completa):
Aqui esta
sprite.png
:Ahora, tengo algunas cosas que decir.
¡No me juzgues por ese terrible código! : PI lo escribió hace muchos años cuando tenía una programación terrible. De hecho, es de los viejos tiempos del sitio web que tenía que ni siquiera recordaba que tenía. http://oddllama.cu.cc/terrain/
Copié mucho código de la demostración isométrica de Crafty.JS . :PAG
¡La explicación vendrá pronto! Tengo que ir a dormir ahora, ya que es tarde aquí. (¡Es por eso que el sprite es tan terrible!)
Básicamente, ¡está realmente sin pulir y se mejorará enormemente más adelante!
Utiliza el mismo algoritmo de diamante cuadrado mencionado en la respuesta del OP.
fuente
Ruby + RMagick
Estoy usando el algoritmo Diamond-Square para generar el mapa de altura.
El algoritmo en resumen:
[0,0] == [4,0] == [0,4] == [4,4]
. Además[-2,0] == [2,0]
, etc.[0,0]
en un color aleatorio[0,0] == [4,0] == [0,4] == [4,4]
)Como esto dará como resultado una imagen gris aburrida, debe agregar un número aleatorio a este valor en cada paso. Se prefiere que este valor aleatorio abarque todo el rango en la primera iteración, pero disminuye con el tiempo cuando se abordan subconjuntos cada vez más pequeños de la matriz. Cuanto menos disminuya esta aleatoriedad con el tiempo, más ruidosa será la imagen.
Después de terminar, simplemente estoy asignando un color para cada valor de altura.
Código:
generate.rb
Gemfile
Nota: La Imagemagick que estoy usando es de 16 bits
Imagen de resultado:
Nota: esta imagen es una representación isométrica de arriba hacia abajo, donde el tamaño de un voxel es exactamente un píxel, por lo que es válido de acuerdo con las reglas (excepto uno: que mi respuesta no se considera válida)
fuente
Java (usando la imagen en color de @ fejesjoco como algoritmo base)
Después de jugar un poco con las imágenes en color FullRGB de @fejesjoco, noté que podrían usarse como base para interesantes paisajes de voxel acantilados. En lugar de volver a implementar el algoritmo, utilicé su código como un ejecutable externo (descárguelo de http://joco.name/2014/03/02/all-rgb-colors-in-one-image/ y colóquelo como artgen. exe en el mismo directorio)
Avance:
mapa de altura utilizado (almacenado en el canal azul)
Imagen de entrada:
El subalgoritmo que uso de él funciona de esa manera:
1. Clasificación
2. Comience con un píxel negro en el centro
3. Hasta que se usen todos los colores: coloque el color actual en el punto de ajuste más cercano y agregue los vecinos no utilizados como nuevos puntos utilizables. Cuando terminó, lo destrocé para reducirlo a 256 valores diferentes
red&(green|blue)
4. luego uso sprites pregenerados y genero la imagen capa por capafuente
HTML + JavaScript
Aquí está mi intento en la competencia:
Utilizo el algoritmo Euclidean F1 Cell Noise para generar un mapa de altura que luego transformo en una imagen tomando el color apropiado de una matriz y dibujando un cuadrado a 10x, 10y de altura para que se eleven los píxeles más altos. Luego dibujo un rectángulo como el lado usando el mismo color de una matriz diferente.
Aquí está el mismo código que usa un algoritmo de caminata aleatoria de 10,000 pasos:
[Caminata aleatoria 2] [4]
Cuando 'camina' por un borde, se enrolla sobre el otro, por lo que todavía se ve bien en mosaico.
Todavía es técnicamente paralelo, solo desde un ángulo diferente.
fuente