Tugas Anda adalah menghasilkan peta ketinggian dan menunjukkannya sebagai lanskap voxel yang diproyeksikan paralel. Aturannya adalah sebagai berikut:
- Lansekap (ketinggian peta) harus dibuat secara acak
- Anda juga harus menjelaskan cara kerja algoritma yang Anda gunakan, sehingga semua orang dapat mempelajari sesuatu yang baru di sini
- Anda juga harus membuat gambar atau menampilkan lanskap yang dihasilkan di layar
- Gambar yang dihasilkan harus diproyeksikan paralell (jadi bukan perspektif), dan hanya dapat berisi voxel (jadi harus dibuat dari kotak kecil)
- Ini adalah kontes popularitas, jadi Anda mungkin ingin menambahkan beberapa fitur tambahan ke program Anda untuk mendapatkan lebih banyak upvotes.
- Pemenangnya adalah jawaban sah yang paling banyak diperbarui 7 hari setelah pengiriman terakhir yang valid. Semua pengiriman yang valid harus mengikuti aturan, termasuk deskripsi dari algoritma yang digunakan. Anda dapat menambahkan fitur tambahan yang tidak mengikuti beberapa aturan (seperti menambahkan mode perspektif), tetapi dalam hal ini mereka harus menjadi fitur opsional (mis. Ketika mematikannya hasilnya harus mengikuti semua aturan)
- Kiriman saya tidak dianggap valid.
Contoh gambar hasil adalah sebagai berikut:
Jawaban:
Python2 3D Function Plotter Edisi Voxel
Ini adalah entri saya di kompetisi ini:
Seperti yang dinyatakan dengan jelas dalam judul ini berfungsi sebagai plotter fungsi 3D, tetapi karena kompetisi ini membutuhkan medan yang akan dihasilkan secara acak, fungsi sinus acak ini
1.5*(math.sin(1/randA*x+randC)+math.sin(1/randB*y+randD))
Tergantung pada 4 variabel acak. Ini menciptakan medan seperti ini:Kita dapat mengganti fungsi acak ini dengan fungsi 2 variabel, misalnya
sin(sqrt((x/2)²+(y/2)²))*3
memberikan medan ini:dan
-x*y*e^(-x^2-y^2)
memberikan ini:(plot di sebelah kanan dihitung oleh wolfram alpha)
Dan sementara kita melakukannya, Riemann zeta di sepanjang jalur kritis:
Untuk orang-orang yang tidak terbiasa dengan itu, karena Anda dapat melihat genangan air ini (yang mewakili nol fungsi) semua terletak pada garis lurus (bagian nyata = 0,5). Jika Anda bisa membuktikan ini, Anda akan mendapatkan $ 10.00000! Lihat tautan ini.
Saya harap Anda menyukainya!
sumber
C #, WPF
Saya telah bereksperimen dengan jalan acak , yang bekerja lebih baik dari yang saya perkirakan. Saya mulai di suatu tempat di peta, berjalan ke ubin acak yang berdekatan dan menambah nilai tingginya , lalu pindah ke yang berikutnya dan seterusnya. Ini diulang ribuan kali dan akhirnya mengarah ke peta ketinggian seperti ini (100 x 100):
Lalu, saya "discretize" peta, mengurangi jumlah nilai ke level ketinggian yang diberikan dan menetapkan medan / warna berdasarkan ketinggian itu:
Lebih mirip medan kepulauan:
Peningkatan jumlah langkah acak dan tingkat ketinggian untuk mendapatkan lebih banyak medan pegunungan:
Kode
Fitur: Buat ulang medan dengan tombol. Tampilkan medan 3D dan peta 2D. Zooming (roda mouse) dan bergulir 3D (tombol panah). Tapi itu tidak terlalu performant - lagipula, ini ditulis murni dalam WPF, bukan DirectX atau OpenGL.
MainWindow.xaml:
MainWindow.xaml.cs
sumber
JavaScript dan Crafty.JS, harus lebih ditingkatkan
Berikut ini contoh keluaran:
Dan inilah kodenya (halaman web lengkap):
Ini adalah
sprite.png
:Sekarang, saya punya beberapa hal untuk dikatakan.
Jangan menilai saya untuk kode mengerikan itu! : PI menulisnya bertahun-tahun yang lalu ketika saya adalah pemrograman yang mengerikan. Bahkan, itu dari masa lalu situs web yang saya miliki yang saya bahkan tidak ingat saya punya! http://oddllama.cu.cc/terrain/
Saya semacam menyortir banyak kode dari demo Isometrik Crafty.JS . : P
Penjelasan akan segera hadir! Saya harus tidur sekarang karena sudah terlambat di sini. (Itu juga sebabnya sprite sangat mengerikan!)
Pada dasarnya, ini benar-benar tidak dipoles dan akan jauh lebih baik nanti!
Ini menggunakan algoritma berlian-persegi yang sama yang disebutkan dalam jawaban OP.
sumber
Ruby + RMagick
Saya menggunakan algoritma Diamond-Square untuk menghasilkan peta ketinggian.
Algoritma singkatnya:
[0,0] == [4,0] == [0,4] == [4,4]
. Juga[-2,0] == [2,0]
, dll.[0,0]
ke warna acak[0,0] == [4,0] == [0,4] == [4,4]
)Karena ini akan menghasilkan gambar abu-abu yang membosankan, Anda harus menambahkan angka acak ke nilai ini di setiap langkah. Lebih disukai bahwa nilai acak ini mencakup seluruh rentang pada iterasi pertama, tetapi berkurang seiring waktu ketika Anda menangani subset array yang lebih kecil dan lebih kecil. Semakin sedikit keacakan ini berkurang dari waktu ke waktu, semakin bising gambar akan.
Setelah saya selesai saya hanya menetapkan warna untuk setiap nilai ketinggian.
Kode:
menghasilkan.rb
Gemfile
Catatan: Imagemagick yang saya gunakan adalah 16bit
Gambar hasil:
Catatan: gambar ini adalah top-down, representasi isometrik, di mana ukuran satu voxel tepat satu piksel, jadi valid menurut aturan (kecuali satu: bahwa jawaban saya tidak dianggap valid)
sumber
Java (menggunakan warna-image @ fejesjoco sebagai algoritma dasar)
Setelah bermain-main dengan gambar warna FullRGB dari @fejesjoco saya perhatikan bahwa mereka dapat digunakan sebagai dasar untuk lanskap voxel tebing yang menarik. Alih-alih mengimplementasikan ulang algoritma saya menggunakan kodenya sebagai executable eksternal (unduh dari http://joco.name/2014/03/02/all-rgb-colors-in-one-image/ dan letakkan sebagai artgen. exe di direktori yang sama)
Pratinjau:
heightmap yang digunakan (disimpan dalam saluran biru)
Input gambar:
Subalgoritma yang saya gunakan darinya bekerja dengan cara seperti itu:
1. Menyortir
2. Mulai dengan piksel hitam di tengah
3. Hingga semua warna digunakan: letakkan warna saat ini di tempat pemasangan terdekat dan tambahkan tetangga yang tidak digunakan sebagai tempat yang dapat digunakan baru Ketika selesai saya memotong-motongnya untuk mengurangi menjadi 256 nilai yang berbeda
red&(green|blue)
4. lalu saya menggunakan sprite pregenerated dan menghasilkan gambar lapis demi lapissumber
HTML + JavaScript
Inilah usaha saya di kompetisi:
Saya menggunakan algoritme Noise Sel Euclidean F1 untuk menghasilkan peta ketinggian yang kemudian saya ubah menjadi gambar dengan mengambil warna yang sesuai dari sebuah array dan menggambar kotak dengan tinggi 10x, tinggi 10y sehingga piksel lebih tinggi terangkat. Saya kemudian menggambar segi empat sebagai sisi menggunakan warna yang sama dari array yang berbeda.
Berikut adalah kode yang sama menggunakan algoritma 10.000 langkah acak:
! [Random Walk 2] [4]
Ketika 'berjalan' dari satu sisi itu membungkus ke sisi lain, jadi itu masih terlihat bagus.
Secara teknis masih paralel, hanya dari sudut yang berbeda.
sumber