L-Systems , dari apa yang dapat saya katakan *, adalah seperangkat aturan substitusi seperti tata bahasa yang dapat Anda terapkan secara rekursif untuk mendapatkan hasil "organik" yang menarik.
Tanaman adalah tempat L-Systems sering digunakan, karena mereka menunjukkan banyak pertumbuhan rekursif (yaitu cabang terpecah menjadi lebih banyak cabang). Sebagai contoh sederhana, saya akan menunjukkan pohon "lollipop" yang dihasilkan menggunakan L-System:
variables : | o (these are the things that will grow)
start : o
| (this is what we start with)
rules : (o → o o) (these are the substitution rules that we apply
\ / one step at a time)
Jadi pada generasi 1, kita baru saja memulai:
o
|
Pada generasi 2, kami mengikuti setiap aturan dan mengganti bagian yang ada sesuai dengan aturan. Kami mengganti "bola" dengan "bola dua tongkat":
o o
\ /
|
Generasi 3:
o o o o
\| |/
\ /
|
Kami akan segera memiliki pohon besar yang cantik (jelek)!
Untuk melakukan ini dalam kode, Anda dapat melakukan ini secara rekursif (yaitu DFS), terus menerapkan aturan pada bagian yang sama sampai Anda mencapai akhir yang sewenang-wenang, atau Anda dapat melakukan ini secara iteratif (yaitu BFS) seperti yang telah kami lakukan dalam contoh ini , melakukan satu aturan "lulus" pada semua elemen dan mengulangi sejumlah langkah. Itu adalah:
Secara rekursif:
tree = start
grow(tree, start)
func grow(tree, part)
if this part of the tree is big enough
stop
if part is 'o'
replace part with 'o\/o'
grow(tree, the left 'o')
grow(tree, the right 'o')
Secara berulang:
tree = start
for a number of iterations
for each part in tree
if part is 'o':
replace with 'o\/o'
Banyak penggunaan L-Systems melakukan langkah "tumbuh" menggunakan subdivisi - yaitu, bagian-bagian terus semakin kecil karena mereka "tumbuh", bagian-bagian yang lebih besar baru saja dibagi. Kalau tidak, sistem Anda yang tumbuh mungkin mulai tumpang tindih dengan sendirinya. Anda akan melihat contoh pohon lollipop saya, saya secara ajaib memastikan dua cabang tidak tumpang tindih di tengah dengan mengubah bentuk cabang baru. Mari kita lakukan contoh kota menggunakan subdivisi:
variables: block_vertical block_horizontal road_vertical road_horizontal
start: block_vertical
rules: (block_vertical → block_horizontal road_vertical block_horizontal)
(block_horizontal → block_vertical road_horizontal block_vertical)
Ini akan masuk akal dalam satu menit.
Generasi 1:
+--------------------+
| |
| |
| |
| V |
| |
| |
| |
+--------------------+
Satu blok vertikal tunggal yang membosankan. (The V adalah singkatan dari vertikal.)
Generasi 2: kami mengganti blok vertikal dengan blok horisontal dengan jalan vertikal di tengah
+--------------------+
| r |
| r |
| r |
| H r H |
| r |
| r |
| r |
+--------------------+
R berarti jalan! Saya sudah membagi spasi secara acak, kami tidak ingin bagian biasa membosankan di PCG.
Generasi 3: kami mengganti blok horizontal dengan blok vertikal yang dipisah dengan jalan horizontal. Jalan yang ada tetap; tidak ada aturan untuk mereka.
+--------------------+
| V r |
| r |
|rrrrrrrr |
| r V |
| V r |
| rrrrrrrrrrrrr|
| r V |
+--------------------+
Perhatikan bagaimana jalan terhubung satu sama lain, yang bagus. Ulangi ini cukup kali dan Anda akan berakhir dengan sesuatu seperti ini (secara terang-terangan merobek jawaban terkait ):
Perhatikan bahwa ada banyak detail yang belum saya bahas, dan bahwa hasil ini terlihat "jelas" dihasilkan - kota-kota nyata terlihat agak berbeda. Itulah yang membuat PCG menyenangkan / sulit. Ada hal-hal tak berujung yang dapat Anda lakukan untuk mengubah dan meningkatkan hasil Anda, tetapi karena tidak terkait dengan L-Systems, saya akan meninggalkan jawaban ini di sini; Semoga ini bisa membantu Anda memulai.
* - Saya belum mempelajari L-Systems secara formal, walaupun saya telah menemukan tipe spesifik seperti tata bahasa dan vegetasi PCG; tolong perbaiki saya jika saya salah definisi atau konsep