Twoim zadaniem jest wygenerowanie mapy wysokości i pokazanie jej jako równolegle rzutowanego krajobrazu wokseli. Reguły są następujące:
- (Mapa wysokości) krajobrazu musi być generowana losowo
- Musisz także opisać działanie algorytmu, którego używasz, aby każdy mógł dowiedzieć się tutaj czegoś nowego
- Musisz także wygenerować obraz lub wyświetlić wygenerowany krajobraz na ekranie
- Powstały obraz musi być rzutowany równolegle (więc nie perspektywicznie) i może zawierać tylko woksele (więc musi być zrobiony z małych pudełek)
- To konkurs popularności, więc możesz chcieć dodać dodatkowe funkcje do swojego programu, aby uzyskać więcej głosów pozytywnych.
- Zwycięzca jest najbardziej pozytywnie ocenioną ważną odpowiedzią 7 dni po ostatnim ważnym zgłoszeniu. Wszystkie prawidłowe zgłoszenia muszą być zgodne z regułami, w tym z opisem zastosowanego algorytmu. Możesz dodać dodatkowe funkcje, które nie są zgodne z niektórymi zasadami (np. Dodanie trybu perspektywy), ale w tym przypadku muszą to być funkcje opcjonalne (np. Po ich wyłączeniu wynik powinien być zgodny z wszystkimi regułami)
- Moje zgłoszenie nie jest uważane za ważne.
Przykładowy obraz wyniku jest następujący:
popularity-contest
graphical-output
Sztuczki
źródło
źródło
Odpowiedzi:
Plotter funkcji Python2 3D Voxel Edition
Oto mój udział w tym konkursie:
Jak wyraźnie stwierdzono w tytule, działa on jako ploter funkcji 3D, ale ponieważ ta konkurencja wymaga losowego wygenerowania terenu, ta losowa funkcja sinusoidalna
1.5*(math.sin(1/randA*x+randC)+math.sin(1/randB*y+randD))
zależy od 4 losowych zmiennych. Tworzy to takie tereny:Możemy oczywiście zastąpić tę losową funkcję dowolną 2 zmienną funkcją, na przykład
sin(sqrt((x/2)²+(y/2)²))*3
daje ten teren:i
-x*y*e^(-x^2-y^2)
daje to:(wykresy po prawej są obliczane przez wolfram alfa)
A gdy już nad tym jesteśmy, Riemann zeta wzdłuż paska krytycznego:
Dla osób, które nie są obeznane z tym, ponieważ można zobaczyć te kałuże wody (które reprezentują zera funkcji) wszystkie leżą na linii prostej (część rzeczywista = 0,5). Jeśli możesz to udowodnić, otrzymasz 1000000 $! Zobacz ten link.
Mam nadzieję, że to lubisz!
źródło
C #, WPF
Eksperymentowałem z przypadkowym spacerem , który działa lepiej, niż się spodziewałem. Zaczynam gdzieś na mapie, podchodzę do przypadkowego sąsiadującego kafelka i zwiększam jego wysokość , a następnie przechodzę do następnego i tak dalej. Jest to powtarzane tysiące razy i ostatecznie prowadzi do takiej mapy wysokości (100 x 100):
Następnie „dyskretyzuję” mapę, zmniejszam liczbę wartości do podanych poziomów wysokości i przypisuję teren / kolor na podstawie tej wysokości:
Więcej podobnych terenów podobnych do archipelagu:
Zwiększona liczba losowych kroków i poziomów wysokości, aby uzyskać bardziej górzysty teren:
Kod
Cechy: Odtwórz teren za pomocą przycisku. Pokaż teren 3D i mapę 2D. Powiększanie (kółko myszy) i przewijanie 3D (klawisze strzałek). Ale nie jest bardzo wydajny - w końcu jest napisany wyłącznie w WPF, a nie w DirectX lub OpenGL.
MainWindow.xaml:
MainWindow.xaml.cs
źródło
JavaScript i Crafty.JS, aby zostać znacznie ulepszone
Oto przykładowy wynik:
A oto kod (pełna strona):
Oto
sprite.png
:Teraz mam kilka rzeczy do powiedzenia.
Nie oceniaj mnie za ten okropny kod! : PI napisał to wiele lat temu, gdy byłem okropnym programistą. Tak naprawdę to z dawnych czasów strony, którą miałem, a nawet nie pamiętałem, że miałem! http://oddllama.cu.cc/terrain/
W pewnym sensie skopiowałem mnóstwo kodu z demo Crafty.JS Isometric. : P
Wyjaśnienie nastąpi wkrótce! Muszę teraz iść spać, bo tu jest późno. (Dlatego też duszek jest taki okropny!)
Zasadniczo jest to naprawdę nieoszlifowane i zostanie znacznie poprawione później!
Wykorzystuje ten sam algorytm kwadratu diamentowego, o którym mowa w odpowiedzi PO.
źródło
Ruby + RMagick
Używam algorytmu Diamond-Square do generowania mapy wysokości.
Algorytm w skrócie:
[0,0] == [4,0] == [0,4] == [4,4]
. Również[-2,0] == [2,0]
itp.[0,0]
losowy kolor[0,0] == [4,0] == [0,4] == [4,4]
)Ponieważ spowoduje to nudny, szary obraz, musisz dodać losową liczbę do tej wartości na każdym kroku. Preferowane jest, aby ta losowa wartość obejmowała cały zakres przy pierwszej iteracji, ale zmniejsza się z czasem, gdy adresowane są coraz mniejsze podzbiory tablicy. Im mniej ta losowość maleje z czasem, tym bardziej hałaśliwy będzie obraz.
Po zakończeniu po prostu przypisuję kolor do każdej wartości wysokości.
Kod:
generate.rb
Gemfile
Uwaga: Imagemagick, z którego korzystam, jest 16-bitowy
Obraz wynikowy:
Uwaga: ten obraz jest izometryczną reprezentacją z góry na dół, gdzie rozmiar jednego woksela wynosi dokładnie jeden piksel, więc jest zgodny z regułami (z wyjątkiem jednego: moja odpowiedź nie jest uważana za prawidłową)
źródło
Java (używając kolorowego obrazu @ fejesjoco jako algorytmu podstawowego)
Po zabawie z kolorowymi obrazami FullRGB z @fejesjoco zauważyłem, że można je wykorzystać jako bazę do ciekawych krajobrazów z klifami wokselowymi. Zamiast reimplementacji algorytmu użyłem jego kodu jako zewnętrznego pliku wykonywalnego (pobierz go z http://joco.name/2014/03/02/all-rgb-colors-in-one-image/ i umieść go o nazwie artgen. exe w tym samym katalogu)
Zapowiedź:
zastosowana mapa wysokości (przechowywana w niebieskim kanale)
Obraz wejściowy:
Użyty z niego pod-algorytm działa w ten sposób:
1. Sortowanie
2. Zacznij od czarnego piksela w środku
3. Aż do użycia wszystkich kolorów: umieść bieżący kolor w najbliższym pasującym miejscu i dodaj nieużywane sąsiady jako nowe użyteczne miejsca Po zakończeniu zmieniam go, aby zredukować do 256 różnych wartości
red&(green|blue)
4. następnie używam wstępnie wygenerowanych duszków i generuję obraz warstwa po warstwieźródło
HTML + JavaScript
Oto moja próba konkursu:
Używam algorytmu Euclidean F1 Cell Noise do generowania mapy wysokości, którą następnie przekształcam w obraz, pobierając odpowiedni kolor z tablicy i rysując kwadrat o wysokości 10x, 10y, aby wyższe piksele były podnoszone. Następnie rysuję prostokąt jako bok, używając tego samego koloru z innej tablicy.
Oto ten sam kod przy użyciu algorytmu 10 000 kroków losowego marszu:
! [Random Walk 2] [4]
Kiedy „schodzi” z jednej krawędzi, owija się na drugiej, dzięki czemu nadal wygląda dobrze kafelkami.
Jest to technicznie równoległe, tylko pod innym kątem.
źródło