This is an old revision of the document!
Laboratorul 03. Sisteme bazate pe Gramatici și Reguli
Lindenmayer Systems
Sistemele Lindenmayer (L-Systems) sunt un model matematic introdus de biologul Aristid Lindenmayer în 1968 pentru a modela procesele de creștere ale plantelor. Acestea sunt deosebit de eficiente pentru simularea structurilor și fractalilor asemănătoare plantelor.
Componentele ale sistemelor L:
Alfabet: Un set de simboluri care reprezintă diverse componente ale unei plante
Axiomă: Șirul inițial de simboluri de la care sistemul își începe construcția
Reguli de producție: O colecție de reguli de substituție care definesc modul în care fiecare simbol poate fi înlocuit sau extins într-un șir mai complex de simboluri.
Exemple de structuri care imită plantele se pot vedea în imaginea de mai jos:
În exemplul de mai sus, se folosește interpretarea “turtle” a stringurilor. Astfel, se întâlnesc următoarele simboluri:
F - Mers înainte cu distanța d
+ - Rotație la stânga cu unghiul δ
- - Rotație la dreapta cu unghiul δ
[ - Adăugarea într-o stivă a stării actuale. Informațiile salvate pe stivă conțin poziția, orientarea și, eventual, alte atribute, cum ar fi culoarea și lățimea liniilor desenate
] - Scoaterea unei stări din stivă și transformarea acesteia în starea curentă. Nu se desenează nimic, deși, în general, poziția se schimbă
n - Numărul de iterații
O variantă în care se poate implementa ușor un L-System este folosind biblioteca turtle din Python. Astfel, pentru a inițializa biblioteca, se folosește următoarea secvență de cod:
# Initialize turtle
t = turtle.Turtle()
wn = turtle.Screen()
t.speed(0)
t.left(90)
t.penup()
t.goto(0, -wn.window_height() // 2 + 20)
t.pendown()
# TODO Your implementation goes here
# Wait for user to close window
wn.mainloop()
Funcții utile în implementarea unui sistem L, folosind turtle:
t.forward(distance) # Move forward
t.goto(position) # Move to position, without drawing anything
t.left(angle) # Turn left
t.right(angle) # Turn right
t.setheading(heading) # Set the rotation angle
t.penup() # Stop drawing
t.pendown() # Start drawing
Cellular Automata
Pentru a genera un dungeon 2D de bază folosind cellular automata, se urmează următorii pași:
Inițializarea unui grid: Se crează un grid 2D în care fiecare celulă este atribuită aleatoriu ca perete sau podea pe baza unei probabilități specificate
Aplicarea regulilor stabilite prin cellular automata: Actualizarea în mod iterativ a gridului, aplicând reguli care determină starea fiecărei celule pe baza vecinilor săi
Rafinare rezultat: După mai multe iterații, gridul va forma spații interconectate, asemănătoare unui dungeon. Procesarea suplimentară poate asigura conectivitate și poate adăuga funcții precum camere și coridoare
Conway's Game of Life
Tasks