Л-системи

AlgaЛ-систем илити Линденмајеров систем је формална граматика, најкоришћенија за моделирање раста биљака. Употребом Л-система̂ могу се добити веома реалистични прикази биљака применом веома једноставних правила. Уосталом, слика говори више од речи: ова „алга“ добијена је једноставним правилом F F +[ + F - F - F ] - [ - F + F + F ].

Шта му је ово F F + …? Једноставно: F исцртава линију одређене дужине у тренутном смеру (на почетку – право на горе); - окреће смер у ком ће се линије исцртавати за одређени број степени на десно; + исто то али на лево; док [ и ] памте тренутни смер и положај исцртавања (кад се исцрта све између заграда, исцртавање се наставља као да тога између није ни било). Кључно је да се ово правило примењује више пута тако што се на сваку линију која би иначе била исцртана примењује цело правило. Можда звучи мало компликовано, али ево појашњења на једном још једноставнијем правилу F [ + F ] F:

У првом кораку,

  • F исцртава линију право на горе;
  • [ памти положај и смер;
  • + окреће смер за 45° на лево;
  • F исцртава линију у том смеру, дакле 45° на лево;
  • ] се враћа на упамћени положај и смер;
  • F исцртава линију право на горе.
У другом кораку се све ово понавља, и то тако што се цело правило понавља за сваку линију која би била исцртана у првом правилу.
У трећем кораку…

Кад сам их се пре неки дан подсетио, направио сам и једну имплементацију Л-система у јаваскрипту (пошто користи уметнути СВГ, не ради у Експлореру). Могуће је задати са̂м систем, дужину линије, угао закрета, и „дубину“, број поновних исцртавања (овде, пажња: све веће од 3 или 4 ће вероватно заглавити бровзер). Имплементација је сразмерно једноставна (сам ко̂д је наравно видљив у, јел, изворном коду стране), рекурзивно пролази кроз ниску правила и исцртава систем; међутим кад сам је завршио сетио сам се да је могло и много једноставније: више пута применити обичан нађи/замени унутар ниске и линеарно прећи коначну ниску исцртавајући… но, то би било варање :)

Осим ова два, ево  још неких занимљивих Л-система:

  • F+F–F+F, угао 60 (Кохова крива)
  • F+F-F-F+F, угао 90 (такође Кохова крива)
  • F+F-F-FF+F+F-F, угао 90 (Кохово острво)
  • F[-FF]+[FFF]-FF[+F], угао 15
  • F[-F]F[+F][F], угао 60
  • F[-F][+F]F, угао 90 „табла“

а ако откријете још неки леп, приложите га у коментару.

Могуће је имати и много комплексније Л-системе: пре свега, оне који користе више од једне променљиве; затим, параметризоване, у којима се унутар правила наводе различити углови и различите дужине линија (као и дебљине, боје…); па „ослучајене“ у којима постоји више правила од којих се једно бира по случајном избору; тродимензионалне… О свему томе у неком од следећих бројева.

Tags: , ,

7 Responses to “Л-системи”

  1. Filip каже:

    Zanimljivo. Osim teoretisanja, da li ovo ima neku konkretnu primenu? :)

  2. Nikola каже:

    Да ли ја то чујем „масовни унос“? :)

  3. Nikola каже:

    Постоје разне конкретне примене. Са̂м Линденмајер је развио Л-системе да би моделирао раст алги (о чему можеш више прочитати на http://en.wikipedia.org/wiki/L-system ) а данас се користе и за моделирање других биљака. Даље, користе се у 3Д графици за масовно прављење дрвећа и другог растиња. Најзад, имам идеју да би се могли користити за прављење фонтова – помоћу Л-система се нацрта „пузавица“ која се обмотава око слова̂ и слично и тако се масовно могу правити нови фонтови, под ОФЛ-ом наравно.

  4. Filip каже:

    Pa fino, fino.

  5. Страхиња каже:

    Ово буди успомене…

    Петница, 1996. година; Кааре Кристијанов „Борландов Це плус плус“, програмирање на 486-ици са 16 МБ РАМ-а… добра стара времена. :-)

  6. Nikola каже:

    Око тог времена сам и ја на Амиги радио нешто слично у Амос бејзику. Додуше колико се сећам не овако формално већ неке фракталне биљке са потпуно случајним гранањем, али принцип је био ту :)

Leave a Reply