L-Systemsจากสิ่งที่ฉันสามารถบอกได้ * เป็นชุดของกฎการแทนที่ไวยากรณ์ที่คุณสามารถนำไปใช้ซ้ำเพื่อให้ได้ผลลัพธ์ที่ "น่าสนใจ"
พืชเป็นที่ที่มักใช้ระบบ L เนื่องจากพวกมันมีการเติบโตแบบวนซ้ำ (เช่นกิ่งไม้แยกออกเป็นหลายสาขา) ตัวอย่างง่ายๆฉันจะแสดงทรี "lollipop" ที่สร้างขึ้นโดยใช้ระบบ L:
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)
ดังนั้นในรุ่นที่ 1 เราเพิ่งเริ่มต้น:
o
|
ที่เจนเนอเรชั่น 2 เราปฏิบัติตามกฎแต่ละข้อและทดแทนส่วนที่มีอยู่ตามกฎ เราแทนที่ "balls" ด้วย "two-sticks-and-balls":
o o
\ /
|
รุ่นที่ 3:
o o o o
\| |/
\ /
|
ในไม่ช้าเราจะมีต้นไม้ใหญ่สวย (เส็งเคร็ง)!
ในการทำรหัสคุณสามารถทำซ้ำ (เช่น DFS) ใช้กฎอย่างต่อเนื่องในส่วนเดียวกันจนกว่าคุณจะถึงจุดสิ้นสุดหรือคุณสามารถทำซ้ำ (เช่น BFS) ตามที่เราทำในตัวอย่างนี้ ดำเนินการหนึ่งกฎ "ส่ง" ในองค์ประกอบทั้งหมดและทำซ้ำหลายขั้นตอน นั่นคือ:
ซ้ำ:
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')
ซ้ำ:
tree = start
for a number of iterations
for each part in tree
if part is 'o':
replace with 'o\/o'
การใช้งาน L-Systems จำนวนมากดำเนินการตามขั้นตอน "การเติบโต" โดยใช้การแบ่งย่อย - นั่นคือส่วนต่าง ๆ จะเล็กลงเรื่อย ๆ ตามที่ "เติบโต" ส่วนที่ใหญ่กว่าเพิ่งถูกแบ่งออก มิฉะนั้นระบบที่กำลังเติบโตของคุณอาจเริ่มทับซ้อนทับตัวเอง คุณจะเห็นในตัวอย่างต้นอมยิ้มของฉันฉันมั่นใจได้อย่างน่าอัศจรรย์ว่าทั้งสองสาขาไม่ทับซ้อนกันโดยการเปลี่ยนรูปร่างของกิ่งใหม่ ลองทำตัวอย่างเมืองโดยใช้ส่วนย่อย:
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)
จะทำให้รู้สึกในไม่กี่นาที
รุ่นที่ 1:
+--------------------+
| |
| |
| |
| V |
| |
| |
| |
+--------------------+
บล็อกแนวตั้งแนวเดียวที่น่าเบื่อ (V หมายถึงแนวตั้ง)
รุ่นที่ 2: เราแทนที่บล็อกแนวตั้งด้วยบล็อกแนวนอนด้วยถนนแนวตั้งที่อยู่ตรงกลาง
+--------------------+
| r |
| r |
| r |
| H r H |
| r |
| r |
| r |
+--------------------+
r หมายถึงถนน! ฉันเว้นระยะห่างแบบสุ่มเราไม่ต้องการชิ้นส่วนปกติที่น่าเบื่อใน PCG
รุ่นที่ 3: เราแทนที่บล็อกแนวนอนด้วยบล็อกแนวตั้งแยกออกเป็นถนนแนวนอน ถนนที่มีอยู่ยังคงอยู่; ไม่มีกฎสำหรับพวกเขา
+--------------------+
| V r |
| r |
|rrrrrrrr |
| r V |
| V r |
| rrrrrrrrrrrrr|
| r V |
+--------------------+
สังเกตว่าถนนเชื่อมต่อกันซึ่งเป็นถนนที่ดี ทำซ้ำพอแล้วและคุณจะพบกับสิ่งนี้ (ฉีกคำตอบที่เกี่ยวข้องอย่างโจ๋งครึ่ม):
โปรดสังเกตว่ามีรายละเอียดมากมายที่ฉันไม่ได้กล่าวถึงและผลลัพธ์นี้มีลักษณะ "ชัดเจน" ที่สร้างขึ้น - เมืองที่แท้จริงดูเหมือนแตกต่างกันบ้าง นั่นคือสิ่งที่ทำให้ PCG สนุก / ยาก มีหลายสิ่งที่คุณสามารถปรับแต่งและปรับปรุงผลลัพธ์ของคุณได้ แต่การไม่เกี่ยวข้องกับ L-Systems ฉันจะทิ้งคำตอบไว้ที่นี่ หวังว่าสิ่งนี้จะช่วยให้คุณเริ่มต้นได้
* - ฉันยังไม่ได้ศึกษาระบบ L อย่างเป็นทางการแม้ว่าฉันจะได้พบกับประเภทเฉพาะเช่นไวยากรณ์และพืชผัก PCG; โปรดแก้ไขให้ฉันด้วยหากฉันพบคำจำกัดความหรือแนวคิดที่ผิด