Tulis sebuah program yang mengambil bilangan bulat dari 0 hingga 65535 (2 16 -1) dan menghasilkan gambar 500 × 500 piksel unik yang terlihat semirip mungkin dengan 6 gambar kehidupan nyata dari tanah retak:
Ini adalah gambar kecil, klik untuk melihat gambar berukuran penuh 500 × 500.
Tujuannya di sini adalah membuat komputer Anda menghasilkan gambar se-fotorealistik mungkin . Jadi idealnya, jika salah satu gambar yang dihasilkan oleh program Anda dicampur dengan 6 gambar di atas, seseorang yang melihat gambar untuk pertama kalinya tidak akan dapat membedakan komputer yang dihasilkan dari yang asli.
Photorealism yang sempurna itu sulit, jadi lakukan saja yang terbaik yang kamu bisa. Ini adalah kontes popularitas sehingga jawaban yang memiliki output yang lebih realistis akan lebih banyak tervvitasi dan lebih mungkin untuk menang.
Aturan
Anda dapat menggunakan fungsi atau pustaka pemrosesan gambar.
Anda dapat mendasarkan algoritma Anda pada informasi yang dikumpulkan dari 6 sampel gambar, tetapi kemungkinan 65536 (2 16 ) gambar output Anda harus secara visual berbeda satu sama lain dan gambar sampel, terutama yang berkaitan dengan pengaturan retakan. Anda harus benar-benar menghasilkan gambar, jangan hanya memutar dan menerjemahkan pilihan dari foto yang sudah ada sebelumnya.
Anda seharusnya tidak melakukan hardcode pada output Anda. Algoritma generik harus digunakan dan angka yang lebih besar dari 65535 secara teoritis harus menghasilkan output yang valid. (Saya telah membatasi itu hanya untuk mengakomodasi tipe integer kecil-maksimum.)
Bilangan bulat input dapat dianggap sebagai benih yang menghasilkan gambar output tanah retak acak. Namun harus deterministik, sehingga input yang sama harus selalu menghasilkan output yang sama.
Gambar yang dihasilkan harus persis 500 × 500 piksel.
Gambar output dapat disimpan dalam format file gambar yang umum, atau hanya ditampilkan.
Pastikan untuk menyertakan beberapa contoh gambar keluaran dalam jawaban Anda, dan nomor input yang sesuai.
Jawaban dengan suara terbanyak menang. Pemilih tentu saja harus memilih jawaban yang berusaha menghasilkan gambar yang mirip dengan 6 sampel, dan menurunkan jawaban yang melanggar aturan atau memberikan hasil yang tidak konsisten.
6 sampel gambar diambil dari texturelib.com . Pilihan area 1000 × 1000 piksel diambil dari dua gambar tanah retak yang lebih besar dan kemudian diubah ukurannya menjadi 500 × 500. Anda dapat menggunakan analisis dari gambar-gambar yang lebih besar ini dalam program Anda, tetapi hasilnya harus secara khusus meniru 6 gambar sampel yang dipilih.
Jawaban:
Mathematica
Sebuah Voronoi diagram terlihat seperti gambar ini, dari Wikipedia, menunjukkan 19 sel, masing-masing berisi satu titik benih tunggal. Sel terdiri dari subregion titik yang titik pembangkitnya masing-masing lebih dekat daripada titik benih lainnya.
Kode di bawah ini menghasilkan diagram dari 80 titik acak (di wilayah kuadrat terikat oleh (-1, -1) dan (1,1)).
Ia menggunakan primitif poligon (dalam 2D) dalam diagram untuk membangun polihedra (dalam 3D). Bayangkan bahwa setiap poligon memiliki, tepat di bawahnya, terjemahan (-.08 dalam z) dari dirinya sendiri. Pikirkan dua poligon sebagai bagian atas dan bawah dari polihedron. "Sisi wajah" kemudian ditambahkan untuk menyelesaikan polyhedron.
Setiap polyhedron kemudian diterjemahkan ke luar, dari pusat gambar, pada bidang xy; bergerak menjauh dari tengah. Besarnya terjemahan bervariasi secara langsung dengan jarak antara titik acak penghasil asli polyhedron dan pusat layar. Ini "menyebar" dari polyhedra di bidang xy menghasilkan celah-celah.
Kode
sumber
Jawa
Saya menggunakan pendekatan yang didasarkan pada diagram Voronoi rekursif. Outputnya tidak terlihat sangat realistis, tapi saya kira mereka baik-baik saja.
Berikut adalah beberapa contoh gambar (diubah ukurannya menjadi 250x250 sehingga tidak memenuhi seluruh layar):
0:
1:
Lebih detail tentang algoritma:
Semua gambar di bagian ini menggunakan seed yang sama.
Algoritma dimulai dengan menghasilkan diagram Voronoi dengan 5 poin:
Jika kita melihat gambar asli dalam tantangan, kita dapat melihat bahwa garis tidak semuanya lurus seperti itu, jadi kita menimbang jarak dengan nilai acak, berdasarkan sudut ke titik, juga, sudut yang lebih dekat memberikan nilai yang lebih dekat :
Sekarang, kami menggambar diagram Voronoi semacam ini secara berulang di dalam setiap wilayah, dengan garis yang lebih tipis dan lebih transparan, dan menghapus latar belakang, dengan kedalaman rekursi maksimum 3, dan kami mendapatkan:
Sekarang, kita tambahkan saja latar belakang coklat pucat, dan kita selesai!
Kode:
Kode terdiri dari tiga kelas
Main.java
,,VoronoiPoint.java
danVector.java
:Main.java
:VoronoiPoint.java
:Vector.java
: (Kelas ini disalin dari salah satu proyek saya yang lain, sehingga berisi beberapa kode yang tidak perlu)Tapi saya tidak ingin mengkompilasi banyak kelas Java!
Ini adalah file JAR yang dapat Anda jalankan untuk menghasilkan gambar-gambar ini sendiri. Jalankan sebagai
java -jar Soil.jar number
, di mananumber
benih (bisa apa saja hingga 2 31 -1), atau dijalankan sebagaijava -jar Soil.jar
, dan ia memilih benih dengan sendirinya. Akan ada beberapa hasil debug.sumber
Python 3 (menggunakan perpustakaan Kivy dan GLSL)
Gambar yang dihasilkan pertama
Kode python:
File KV:
Kode GLSL:
Fungsi voronoi dalam kode GLSL berasal dari Íñigo Quílez. Setiap perhitungan terkait voronoi terjadi dalam fragmen shader sepenuhnya dengan beberapa fungsi kebisingan prosedural untuk membuat bintik-bintik dan sedikit mengganggu garis-garis pola voronoi.
Dengan menekan spasi, seed akan bertambah 1 dan gambar baru akan dihasilkan dan disimpan sebagai
.png
file.Pembaruan: Menambahkan distorsi lense, vignetting, dan chromatic aberration agar lebih realistis foto. Menambahkan pola sub-voronoi.
sumber
seed
. Ini akan disalurkan ke shader sebagai variabel float seragam. Dalam fungsi retak shader benih digunakan untuk menerjemahkan titik dengan nilai benih.Jawa
Membuat gabungan dua diagram acak yang kemudian dijalankan melalui deteksi tepi sederhana dan akhirnya dikonversi ke hasil akhir.
Beberapa output:
Beberapa langkah perantara untuk yang terakhir:
(Diagram voronoi pertama)
(Komposit dari dua diagram voronoi)
(Setelah langkah deteksi tepi tetapi sebelum recoloring akhir)
sumber