در این بخش قصد داریم با یک مثال جالب حلقه های تکرار را با L-system آموزش بدهیم.
در سال 1968 یک بیولوژیست به نام آریستید لیندمیر، فرمولی اختراع کرد که میتوانست به زبان ریاضی نحوه رشد گیاهان را تشریح کند که آن را L-system نامید. L-system طراحی شده بود تا روش رشد بیولوژیکی گیاهان را شبیه سسازی کند .این سیستم را میتوان به عنوان تعدادی دستورالعمل در نظر گرفت که نحوه رشد یک سلول را تعریف میکند. L-system میتواند دستورالعملهای جالبی را برای نحوه رشد یک سیستم گیاهی تعریف کنید . در این مثال ما میخواهیم سیستم را طوری طراحی کنیم که تصاویر جالبی را برایمان طراحی کند.
قوانین L-system سیستم درواقع به این صورت است که یک رشته را دریافت میکند و آن را به یک رشته جدید تبدیل می کند .
به مثال زیر توجه کنید :
محور اصلی Axiom | A |
قانون اول : A را به B تغییر بده | A->B |
قانون دوم : B را به AB تغییر بده | B->AB |
در یک حلقه تکرار به تعداد دفعات معین قانون را روی رشته ورودی اجرا میکنیم :
حالا بیاید این قوانین را اجرا کنیم
A | |
قانون اول | B |
قانون دوم | AB |
قانون اول به A قانون دوم به B | BAB |
قانون دوم به B ،قانون اول به A و قانون دوم به B | ABBAB |
توجه داشته باشید که در هر خط ما قوانین را بر روی تمام کارکتر های جدید اجرا میکنیم و نتیجه جدید را در خط بعدی مینویسیم.
حالا بیایید این قوانین را در پایتون اجرا کنیم. برای این کار سه تابع تعریف میکنیم اولی برای اجرا حلقه به تعداد دفعات درخواستی یکی برای اینکه بر روی رشته حلقه ایجاد کنیم و دیگری برای اینکه قوانین L-system را اجرا کنیم :
def applyRules(lhch): rhstr = "" if lhch == 'A': rhstr = 'B' # Rule 1 elif lhch == 'B': rhstr = 'AB' # Rule 2 else: rhstr = lhch # no rules apply so keep the character return rhstr def processString(oldStr): newstr = "" for ch in oldStr: newstr = newstr + applyRules(ch) return newstr def createLSystem(numIters,axiom): startString = axiom endString = "" for i in range(numIters): endString = processString(startString) startString = endString return endString print(createLSystem(12, "A"))
خروجی کد بالا به شکل زیر خواهد بود :
حالاا به شرح این قانون می پردازیم هر کدام ازین علامت ها یک معنی خواص دارند :
یعنی به مقدار معین به جلو حرکت کن
F
یعنی به مقدار معین به عقب حرکت کن
B
یعنی به میزان درجه معین به چپ بچرخ
-
یعنی به میزان درجه معین به راست بچرخ
+
حالا این قوانین را در برنامه در تابع applyRules اعمال میکنیم :
def applyRules(ch): newstr = "" if ch == 'F': newstr = 'F-F++F-F' # Rule 1 else: newstr = ch # no rules apply so keep the character return newstr
خب تا الان متوجه شدیم که برای اعمال قوانی L-system چکار باید بکنیم حالا کافیست این قوانین را عملی کنیم تا بتوانیم خروجی کار را در مانیتور مشاهده کنیم . در کد بالا ما هنوز خروجی تصویر نگرفته ایم و فقط یک رشته ساده داریم حالا باید کاری بکنیم این رشته متنی با توجه به قوانینی که شرح دادیم تبدیل به تصویر بشوند
برای نشان دادن تصویر در خروجی از ماژول Turtle استفاده میکنیم برای کسب اطلاعات بیشتر در مورد نحوه رسم در Turtle کلیک کنید .
حالا تابع DrawLsystem را به شکل زیر تغییر می دهیم برای این تابع 4 پارمتر ورودی تعیین مکنیم :
- یک turtle برای رسم شکل
- یک رشته متنی حاوی خروجی فرمول L-System
- زاویه چرخش
- و میزان حرکت به جلو یا عقب
def drawLsystem(aTurtle,instructions,angle,distance):
for cmd in instructions:
if cmd == 'F':
aTurtle.forward(distance)
elif cmd == 'B':
aTurtle.backward(distance)
elif cmd == '+':
aTurtle.right(angle)
elif cmd == '-':
aTurtle.left(angle)
و کد نهایی ما به صورت کامل به شکل زیر خواهد بود :
import turtle
def createLSystem(numIters,axiom):
startString = axiom
endString = ""
for i in range(numIters):
endString = processString(startString)
startString = endString
return endString
def processString(oldStr):
newstr = ""
for ch in oldStr:
newstr = newstr + applyRules(ch)
return newstr
def applyRules(ch):
newstr = ""
if ch == 'F':
newstr = 'F-F++F-F' # Rule 1
else:
newstr = ch # no rules apply so keep the character
return newstr
def drawLsystem(aTurtle, instructions, angle, distance):
for cmd in instructions:
if cmd == 'F':
aTurtle.forward(distance)
elif cmd == 'B':
aTurtle.backward(distance)
elif cmd == '+':
aTurtle.right(angle)
elif cmd == '-':
aTurtle.left(angle)
def main():
inst = createLSystem(4, "F") # create the string
print(inst)
t = turtle.Turtle() # create the turtle
wn = turtle.Screen()
t.up()
t.back(200)
t.down()
t.speed(9)
drawLsystem(t, inst, 60, 5) # draw the picture
# angle 60, segment length 5
wn.exitonclick()
main()
خروجی این برنامه شکل زیر خواهد بود:
با تشکر از توجه شما سوالات و تجربه خودتون رو از L-system با من در میون بزارید
قسمت بعدی : سیستم ال L-system و لیست ها در پایتون
دیدگاهتان را بنویسید