Podziękowania dla hobby Calvina za popchnięcie mojego pomysłu na wyzwanie we właściwym kierunku.
Rozważ zestaw punktów w płaszczyźnie, które nazwiemy witrynami , i skojarzmy kolor z każdą witryną. Teraz możesz pomalować całą płaszczyznę, kolorując każdy punkt kolorem najbliższego miejsca. Nazywa się to mapą Voronoi (lub diagramem Voronoi ). Zasadniczo mapy Voronoi można zdefiniować dla dowolnej metryki odległości, ale użyjemy zwykłej odległości euklidesowej r = √(x² + y²)
. ( Uwaga: niekoniecznie musisz wiedzieć, jak obliczać i renderować jeden z nich, aby konkurować w tym wyzwaniu).
Oto przykład ze 100 stronami:
Jeśli spojrzysz na dowolną komórkę, wszystkie punkty w tej komórce są bliżej odpowiedniego serwisu niż do dowolnego innego serwisu.
Twoim zadaniem jest przybliżenie danego obrazu za pomocą takiej mapy Voronoi. Dostaniemy obraz w dowolnym, wygodnym formacie grafiki rastrowej, jak również całkowitą N . Następnie powinieneś stworzyć do N stron i kolor dla każdej strony, tak aby mapa Voronoi oparta na tych stronach była jak najbardziej zbliżona do obrazu wejściowego.
Możesz użyć fragmentu stosu u dołu tego wyzwania, aby wyrenderować mapę Voronoi na podstawie wyników lub możesz ją renderować samodzielnie, jeśli wolisz.
Państwo może wykorzystać funkcje wbudowane lub innych firm w celu obliczenia mapy Voronoi ze zbioru stron (jeśli trzeba).
To konkurs popularności, więc wygrywa odpowiedź z największą liczbą głosów netto. Zachęca się wyborców do oceniania odpowiedzi według
- jak dobrze oryginalne obrazy i ich kolory są przybliżone.
- jak dobrze algorytm działa na różnych rodzajach obrazów.
- jak również algorytm działa dla małych N .
- czy algorytm adaptacyjnie grupuje punkty w obszarach obrazu, które wymagają więcej szczegółów.
Testuj obrazy
Oto kilka zdjęć, na których można przetestować algorytm (niektórzy z naszych zwykłych podejrzanych, niektórzy nowi). Kliknij zdjęcia, aby zobaczyć większe wersje.
Plaża w pierwszym rzędzie została narysowana przez Olivię Bell i uwzględniona za jej zgodą.
Jeśli chcesz dodatkowego wyzwania, wypróbuj Yoshi na białym tle i popraw jego linię brzucha.
Wszystkie te obrazy testowe można znaleźć w galerii imgur, z której można pobrać wszystkie w postaci pliku zip. Album zawiera również losowy schemat Voronoi jako kolejny test. Dla porównania, oto dane, które je wygenerowały .
Proszę dołączyć przykładowe diagramy dla różnych obrazów i N , np. 100, 300, 1000, 3000 (a także przypisy do niektórych odpowiednich specyfikacji komórek). Możesz używać lub pomijać czarne krawędzie między komórkami według własnego uznania (może to wyglądać lepiej na niektórych obrazach niż na innych). Nie dołączaj jednak witryn (z wyjątkiem osobnego przykładu, być może jeśli chcesz wyjaśnić, jak działa umieszczanie witryny).
Jeśli chcesz pokazać dużą liczbę wyników, możesz utworzyć galerię na imgur.com , aby zachować rozsądny rozmiar odpowiedzi. Ewentualnie umieść miniatury w swoim poście i umieść w nich linki do większych zdjęć, tak jak zrobiłem to w mojej referencji . Małe miniatury można uzyskać, dołączając s
do nazwy pliku w linku imgur.com (np. I3XrT.png
-> I3XrTs.png
). Ponadto, jeśli znajdziesz coś fajnego, skorzystaj z innych zdjęć testowych.
Renderer
Wklej dane wyjściowe do następującego fragmentu kodu, aby wyświetlić wyniki. Dokładny format listy nie ma znaczenia, o ile każda komórka jest określona przez 5 liczb zmiennoprzecinkowych w kolejności x y r g b
, gdzie x
i y
są współrzędnymi miejsca komórki, i r g b
są kanałami koloru czerwonego, zielonego i niebieskiego w zakresie 0 ≤ r, g, b ≤ 1
.
Fragment zapewnia opcje określania szerokości linii krawędzi komórki i określania, czy witryny komórek powinny być pokazywane (te ostatnie głównie w celu debugowania). Pamiętaj jednak, że dane wyjściowe są ponownie renderowane tylko wtedy, gdy zmieniają się specyfikacje komórek - więc jeśli zmodyfikujesz niektóre inne opcje, dodaj spację do komórek lub czegoś innego.
Ogromne podziękowania dla Raymonda Hilla za napisanie tej naprawdę miłej biblioteki JS Voronoi .