Napisz program, który przyjmuje liczbę całkowitą od 0 do 65535 (2 16 -1) i generuje unikalny obraz o wymiarach 500 × 500 pikseli, który wygląda tak bardzo, jak to możliwe do tych 6 rzeczywistych obrazów pękniętej gleby:
Są to miniatury, kliknij je, aby zobaczyć pełnowymiarowe obrazy 500 × 500.
Celem jest, aby obrazy generowane przez komputer były jak najbardziej fotorealistyczne . Idealnie więc, jeśli którykolwiek z obrazów wyprowadzonych przez Twój program zostanie zmieszany z powyższymi 6 obrazami, ktoś, kto zobaczy te obrazy po raz pierwszy, nie będzie w stanie odróżnić obrazów wygenerowanych komputerowo od rzeczywistych.
Doskonały fotorealizm jest jednak trudny, więc po prostu zrób wszystko, co możesz. Jest to konkurs popularności, więc odpowiedzi, które mają bardziej realistyczne wyniki, będą bardziej oceniane i będą bardziej prawdopodobne, że wygra.
Zasady
Możesz korzystać z funkcji przetwarzania obrazów lub bibliotek.
Możesz oprzeć swój algorytm na informacjach zebranych z 6 przykładowych obrazów, ale twoje 65536 (2 16 ) możliwych obrazów wyjściowych powinny być wizualnie różne od siebie i przykładowych obrazów, szczególnie w odniesieniu do rozmieszczenia pęknięć. Musisz naprawdę generować swoje zdjęcia, a nie tylko obracać i tłumaczyć zaznaczenie z wcześniej istniejącego zdjęcia.
Nie powinieneś inaczej kodować swoich wyników. Należy zastosować ogólny algorytm, a liczby większe niż 65535 powinny teoretycznie dawać prawidłowe wyniki. (Ograniczyłem to tylko po to, aby uwzględnić typy małych i całkowitych liczb całkowitych).
Wejściową liczbę całkowitą można traktować jak ziarno, w wyniku którego powstaje losowo spękany obraz wyjściowy gleby. Powinien być jednak deterministyczny, więc te same dane wejściowe powinny zawsze dawać takie same wyniki.
Obraz wyjściowy musi mieć dokładnie 500 × 500 pikseli.
Obrazy wyjściowe można zapisać w dowolnym popularnym formacie pliku obrazu lub po prostu wyświetlić.
Pamiętaj, aby w odpowiedzi podać kilka przykładowych obrazów wyjściowych i odpowiadające im numery wejściowe.
Odpowiedź z największą liczbą głosów wygrywa. Głosujący powinni oczywiście głosować za odpowiedziami, które próbują stworzyć obrazy podobne do 6 próbek, i głosować za odpowiedziami, które łamią zasady lub dają niespójne wyniki.
6 przykładowych zdjęć zostało pobranych z texturelib.com . Wybrano obszar 1000 × 1000 pikseli z dwóch większych obrazów spękanej gleby, a następnie zmieniono rozmiar do 500 × 500. Możesz użyć analizy z tych większych obrazów w swoim programie, ale wynik powinien szczególnie imitować 6 wybranych obrazów przykładowych.
źródło
Odpowiedzi:
Matematyka
Woronoja diagram wygląda następująco rysunku, Wikipedia, wykazujące 19 komórek, z których każda zawiera pojedynczy punkt nasion. Komórka składa się z podregionu punktów, do których odpowiedni punkt generowania jest bliżej niż którykolwiek z pozostałych punktów początkowych.
Poniższy kod generuje diagram z 80 losowych punktów (w obszarze kwadratu ograniczonym (-1, -1) i (1,1)).
Wykorzystuje prymitywy wielokątów (w 2D) na diagramie do budowy wielościanów (w 3D). Wyobraź sobie, że każdy wielokąt ma tuż pod sobą tłumaczenie (-.08 in z). Pomyśl o dwóch wielokątach jako górnej i dolnej powierzchni wielościanu. Następnie dodaje się „ściany boczne” w celu uzupełnienia wielościanu.
Każdy wielościan jest następnie przesuwany na zewnątrz, od środka obrazu, na płaszczyźnie xy; odsuwa się od środka. Wielkość translacji zmienia się bezpośrednio w zależności od odległości między losowym punktem generującym wielościan i środkiem ekranu. To „rozciągnięcie” wielościanów w płaszczyźnie XY powoduje powstanie szczelin.
Kod
źródło
Jawa
Zastosowałem podejście oparte na rekurencyjnych diagramach Voronoi. Wyniki nie wyglądają zbyt realistycznie, ale myślę, że są w porządku.
Oto kilka przykładowych obrazów (rozmiar 250 x 250, aby nie wypełniał całego ekranu):
0:
1:
Więcej informacji na temat algorytmu:
Wszystkie obrazy w tej sekcji używają tego samego ziarna.
Algorytm zaczyna się od wygenerowania diagramu Voronoi z 5 punktami:
Jeśli spojrzymy na oryginalne obrazy w wyzwaniu, zobaczymy, że wszystkie linie nie są takie proste, więc ważymy odległość losowo, na podstawie kąta do punktu, a także bliższe kąty dają bliższe wartości :
Teraz rekursywnie rysujemy tego rodzaju diagramy Voronoi wewnątrz każdego regionu, z cieńszą i bardziej przezroczystą linią, i usuwamy tło z maksymalną głębokością rekurencji 3, i otrzymujemy:
Teraz dodajemy tylko jasnobrązowe tło i gotowe!
Kod:
Kod składa się z trzech klas,
Main.java
,VoronoiPoint.java
orazVector.java
:Main.java
:VoronoiPoint.java
:Vector.java
: (Ta klasa jest kopiowana z jednego z moich innych projektów, więc zawiera trochę niepotrzebnego kodu)Ale nie chcę kompilować wielu klas Java!
Oto plik JAR, który możesz uruchomić, aby samodzielnie wygenerować te obrazy. Uruchom jako
java -jar Soil.jar number
, gdzienumber
jest ziarno (może być czymkolwiek do 2 31 -1), lub uruchom jakojava -jar Soil.jar
i sam wybiera ziarno. Będzie trochę danych wyjściowych debugowania.źródło
Python 3 (przy użyciu biblioteki Kivy i GLSL)
Pierwszy wygenerowany obraz
Kod Python:
Plik KV:
Kod GLSL:
Funkcja voronoi w kodzie GLSL pochodzi z Íñigo Quílez. Każde obliczenie związane z voronoi odbywa się całkowicie w module cieniującym fragmenty wraz z niektórymi funkcyjnymi funkcjami szumu, aby stworzyć plamki i trochę zakłócić linie wzoru voronoi.
Po naciśnięciu spacji ziarno zostanie powiększone o 1, a nowy obraz zostanie wygenerowany i zapisany jako
.png
plik.Aktualizacja: Dodano zniekształcenie obiektywu, winietowanie i aberrację chromatyczną, aby uczynić go bardziej fotorealistycznym. Dodano wzór sub-voronoi.
źródło
seed
. Zostanie on przesłany do modułu cieniującego jako jednolita zmienna zmiennoprzecinkowa. W funkcji pęknięcia modułu cieniującego ziarno służy do translacji punktu o wartość ziarna.Jawa
Tworzy połączenie dwóch losowych diagramów, które są następnie przeprowadzane przez proste wykrywanie krawędzi i ostatecznie przekształcane w ostateczny wynik.
Niektóre wyjścia:
Niektóre pośrednie kroki dla tego ostatniego:
(Pierwszy schemat voronoi)
(Złożony z dwóch diagramów voronoi)
(Po kroku wykrywania krawędzi, ale przed ostatnim ponownym kolorowaniem)
źródło