Ringraziamo gli hobby di Calvin per aver spinto la mia idea di sfida nella giusta direzione.
Considera una serie di punti nel piano, che chiameremo siti , e associ un colore a ciascun sito. Ora puoi dipingere l'intero piano colorando ogni punto con il colore del sito più vicino. Questa è chiamata una mappa Voronoi (o diagramma Voronoi ). In linea di principio, le mappe Voronoi possono essere definite per qualsiasi metrica di distanza, ma useremo semplicemente la solita distanza euclidea r = √(x² + y²)
. ( Nota: non devi necessariamente sapere come calcolare e rendere uno di questi per competere in questa sfida.)
Ecco un esempio con 100 siti:
Se guardi qualsiasi cella, tutti i punti all'interno di quella cella sono più vicini al sito corrispondente che a qualsiasi altro sito.
Il tuo compito è approssimare una data immagine con una tale mappa Voronoi. Si è dato l'immagine in qualsiasi formato grafica raster comodo, così come un intero N . Dovresti quindi produrre fino a N siti e un colore per ciascun sito, in modo tale che la mappa Voronoi basata su questi siti assomigli il più possibile all'immagine di input.
Puoi utilizzare lo Stack Snippet alla fine di questa sfida per eseguire il rendering di una mappa Voronoi dal tuo output, oppure puoi renderla tu stesso se preferisci.
È possibile utilizzare funzioni integrate o di terze parti per calcolare una mappa Voronoi da un set di siti (se necessario).
Questo è un concorso di popolarità, quindi vince la risposta con il maggior numero di voti netti. Gli elettori sono incoraggiati a giudicare le risposte
- quanto sono approssimate le immagini originali e i loro colori.
- quanto bene l'algoritmo funziona su diversi tipi di immagini.
- quanto bene funziona l'algoritmo per N piccolo .
- se l'algoritmo raggruppa in modo adattivo i punti nelle regioni dell'immagine che richiedono maggiori dettagli.
Immagini di prova
Ecco alcune immagini su cui testare il tuo algoritmo (alcuni dei nostri soliti sospetti, altri nuovi). Fai clic sulle immagini per le versioni più grandi.
La spiaggia in prima fila fu disegnata da Olivia Bell e inclusa con il suo permesso.
Se vuoi una sfida in più, prova Yoshi con uno sfondo bianco e ottieni la linea del ventre giusta.
Puoi trovare tutte queste immagini di prova in questa galleria imgur dove puoi scaricarle tutte come file zip. L'album contiene anche un diagramma Voronoi casuale come altro test. Per riferimento, ecco i dati che lo hanno generato .
Si prega di includere diagrammi di esempio per una varietà di immagini diverse e N , ad esempio 100, 300, 1000, 3000 (nonché pastiglie per alcune delle specifiche delle celle corrispondenti). È possibile utilizzare o omettere i bordi neri tra le celle come meglio credi (ciò potrebbe apparire meglio su alcune immagini rispetto ad altre). Tuttavia, non includere i siti (tranne in un esempio separato, forse se si desidera spiegare come funziona il posizionamento del sito, ovviamente).
Se vuoi mostrare un gran numero di risultati, puoi creare una galleria su imgur.com , per mantenere ragionevole la dimensione delle risposte. In alternativa, metti le miniature nel tuo post e rendili collegamenti a immagini più grandi, come ho fatto nella mia risposta di riferimento . Puoi ottenere le miniature piccole aggiungendo s
il nome del file nel link imgur.com (ad es. I3XrT.png
-> I3XrTs.png
). Inoltre, sentiti libero di usare altre immagini di prova, se trovi qualcosa di carino.
Renderer
Incolla l'output nel seguente frammento di stack per visualizzare i risultati. Il formato esatto dell'elenco è irrilevante, purché ogni cella sia specificata da 5 numeri in virgola mobile nell'ordine x y r g b
, dove x
e y
sono le coordinate del sito della cella e r g b
sono i canali di colore rosso, verde e blu nell'intervallo 0 ≤ r, g, b ≤ 1
.
Lo snippet fornisce opzioni per specificare la larghezza della linea dei bordi della cella e se i siti della cella debbano essere mostrati o meno (quest'ultimo principalmente per scopi di debug). Ma nota che l'output viene ridistribuito solo quando cambiano le specifiche delle celle, quindi se modifichi alcune delle altre opzioni, aggiungi uno spazio alle celle o qualcosa del genere.
Grandi riconoscimenti a Raymond Hill per aver scritto questa bellissima libreria JS Voronoi .