08 септември 2008

Import turtle

Открих един модул за Python наречен turtle. В момента пиша и туториъл за него, който ще бъде включен във pdf туториълът ми за Python който е базиран на поредицата от туториъли които постнах тук(само че добре оформен, с цветен код и повече инфо и екстри + още няколко глави, които може би ще постна и тук).

Та модулът turtle е доста интересна играчка, ако някой от вас знаят какво е LOGO, това е език за деца, при който се пишат команди с които се управлява една "костенурка" на един екран и се чертаят фигурки и такива неща. Страхотен език, учил съм го като малък, и когато открих модулът turtle, който позволява да се чертаят такива неща и в Python направо онемях и започнах да си играя веднага. Написах няколко функции които чертаят готини фигури. Първата функция чертае кръг, модулът има вградена функция за чертане на кръг, но тя е доста бавна, за целта пиша ето този код:

import turtle

def circle():
for x in xrange(360):
turtle.forward(1)
turtle.left(1)

първия ред импортира функциите в turtle(в туториълите не съм говорил много за модули и импортиране, но в pdf-а ще има инфо за това). След това функцията просто изпълнява едни и същи действия 360 пъти, чертае черта дълга един пиксел, след това променя посоката си с 1 градус, така след 360 итерации получаваме кръг. Това е доста яко, реших да видя дали можем да получим нещо по сложно, реших да начертая сложен кръг, съставен от малки кръгове, така че да прилича на спирала, за целта написах тази функция:

def ccircle(f):
for x in xrange(360):
circle()
turtle.up()
turtle.forward(f)
turtle.left(1)
turtle.down()

Тук кодът е приблизително същия, при всяка итерация, функцията чертае кръг, след това костенурката която чертае на екрана се повдига, за да не може да чертае вече, мести се f пиксела на пред, изменя посоката си с 1 градус и след това се връща ан долу, за да може да пише. Така се получава един доста голям кръг от кръгове, в зависимост от f кръговете са близко един до друг и се пресичат в по голямата си част, или са далече и не се пресичат, разбира се е нереалистично да даваме по големи стойности на f от 4-5 защото кръгът ще е прекалено голям за да се побере на екрана, дори сега не се побира правилно, защото е голям и костенурката пие в средата на екрана. Следващата функция която написах е такава която влага такива кръгове един в друг, на практика се получава нещо от рода на голям кръг, след това по малък, и още по малък в него, като матрйошка, но не са концентрични, т.е. кръговете имат допирна точка в долната си част, и не изглеждат като мишена, а като топчета, вкарани една в друга, гравитацията ги дърпа на долу:

def cccircle(n):
if n:
ccircle(n)
cccircle(n-1)

Тук виждаме един доста готин трик наречен рекурсия, всъщност в туториълът този пример ще се използва именно за да се обясни рекурсия. На кратко докато n има някаква стойност(не е 0) ще се чертае кръг от кръг(ccircle) със аргумент n, след това ще се вика същата тази функция cccircle със n-1, по този начин това е нещо като цикъл, можем да получим същия резултат ето така:

while n:
ccircle(n)
n-=1

така n си променя стойноста, при всеки while. това отнема доста време, чертането е бавно, все пак ако дадем на n аргумент 5, това означава че първите 2 функции от circle()(turtle.forward(1),turtle.left(1)) ще трябва да се извикат общо 1296000 пъти, като включим 4-те функции от ccircle които трябва да се извикат 1800 пъти, нещата стават тежки, отнема минути, не знам точно колко, но определено ще ви доскучае ако го гледате как чертае. И сега да стигна до интересната част. turtle има едан функция turtle.fill() която може да запълва фигури, за да я запълни първо трябва да напишем turtle.fill(1) и след това да начертаем фигурата и след това да напишем turtle.fill(0) и фигурата ще се запълни. Ако опитате да запълните горната супер сложна фигура резултатът ще е трагичен. при мен(3.4 гх,1гб рам) за няколко минути целия ми комп замря, след това крашна python,bash,прозореца на който се чертаеше както и двата ми прозореца на firefox които бяха отворени. Явно да запълниш 648000 кръга е трудна задача :D

pdf-ът с туториълът незнам кога да очаквате, вече не е просто 8 блог поста в pdf формат, смятам да поработя малко върху него, имаме нужда от свестен бг туториъл.

Няма коментари: