Créditos a Calvin's Hobbies por empujar mi idea de desafío en la dirección correcta.
Considere un conjunto de puntos en el plano, que llamaremos sitios , y asocie un color con cada sitio. Ahora puede pintar todo el plano coloreando cada punto con el color del sitio más cercano. Esto se llama un mapa de Voronoi (o diagrama de Voronoi ). En principio, los mapas de Voronoi se pueden definir para cualquier métrica de distancia, pero simplemente usaremos la distancia euclidiana habitual r = √(x² + y²)
. ( Nota: no necesariamente tiene que saber cómo calcular y representar uno de estos para competir en este desafío).
Aquí hay un ejemplo con 100 sitios:
Si observa cualquier celda, todos los puntos dentro de esa celda están más cerca del sitio correspondiente que de cualquier otro sitio.
Su tarea es aproximar una imagen dada con dicho mapa de Voronoi. Que le den la imagen en cualquier formato de gráficos de trama conveniente, así como un número entero N . Luego debe producir hasta N sitios y un color para cada sitio, de modo que el mapa de Voronoi basado en estos sitios se parezca lo más posible a la imagen de entrada.
Puede usar el Fragmento de pila al final de este desafío para representar un mapa de Voronoi a partir de su salida, o puede hacerlo usted mismo si lo prefiere.
Usted puede utilizar las funciones built-in o de terceros para calcular un mapa de Voronoi de un conjunto de sitios (si es necesario).
Este es un concurso de popularidad, por lo que gana la respuesta con más votos netos. Se alienta a los votantes a juzgar las respuestas por
- qué tan bien se aproximan las imágenes originales y sus colores.
- qué tan bien funciona el algoritmo en diferentes tipos de imágenes.
- lo bien que el algoritmo funciona para pequeñas N .
- si el algoritmo agrupa de forma adaptativa los puntos en regiones de la imagen que requieren más detalles.
Imágenes de prueba
Aquí hay algunas imágenes para probar su algoritmo (algunos de nuestros sospechosos habituales, algunos nuevos). Haga clic en las imágenes para versiones más grandes.
La playa en la primera fila fue dibujada por Olivia Bell , e incluida con su permiso.
Si quieres un desafío extra, prueba con Yoshi con un fondo blanco y acerta su línea del vientre.
Puede encontrar todas estas imágenes de prueba en esta galería de imágenes donde puede descargarlas todas como un archivo zip. El álbum también contiene un diagrama aleatorio de Voronoi como otra prueba. Como referencia, aquí están los datos que lo generaron .
Incluya diagramas de ejemplo para una variedad de imágenes diferentes y N , por ejemplo, 100, 300, 1000, 3000 (así como pastebins para algunas de las especificaciones de celda correspondientes). Puede usar u omitir bordes negros entre las celdas como mejor le parezca (esto puede verse mejor en algunas imágenes que en otras). Sin embargo, no incluya los sitios (excepto en un ejemplo separado, tal vez si desea explicar cómo funciona la ubicación de su sitio, por supuesto).
Si desea mostrar una gran cantidad de resultados, puede crear una galería en imgur.com , para mantener razonable el tamaño de las respuestas. Alternativamente, coloque miniaturas en su publicación y conviértalas en enlaces a imágenes más grandes, como hice en mi respuesta de referencia . Puede obtener las miniaturas pequeñas agregando s
el nombre del archivo en el enlace imgur.com (por ejemplo, I3XrT.png
-> I3XrTs.png
). Además, siéntase libre de usar otras imágenes de prueba, si encuentra algo bueno.
Renderizador
Pegue su salida en el siguiente fragmento de pila para representar sus resultados. El formato exacto de la lista es irrelevante, siempre que cada celda esté especificada por 5 números de coma flotante en el orden x y r g b
, dónde x
y y
son las coordenadas del sitio de la celda, y r g b
son los canales de color rojo, verde y azul en el rango 0 ≤ r, g, b ≤ 1
.
El fragmento proporciona opciones para especificar un ancho de línea de los bordes de la celda, y si los sitios de la celda deben mostrarse o no (esto último principalmente para fines de depuración). Pero tenga en cuenta que la salida solo se vuelve a representar cuando cambian las especificaciones de la celda, por lo que si modifica algunas de las otras opciones, agregue un espacio a las celdas o algo así.
Créditos masivos a Raymond Hill por escribir esta biblioteca realmente agradable de JS Voronoi .