• No results found

Jak bylo zm´ınˇeno dˇr´ıve, programov´an´ı skriptu jsem rozdˇelil do nˇekolika po sobˇe logicky navazuj´ıc´ıch krok˚u, kter´e umoˇzˇnuj´ı plynulou pr´aci na zdrojov´em k´odu a pr˚ubˇeˇznou kontrolu jeho bˇehu.

Obr´azek 7: Blender pˇri tvorbˇe Python skriptu

4.2.1 Bˇehov´y cyklus programu

Protoˇze je potˇreba v´est r˚ust stromu v pˇredem definovan´em mnoˇzstv´ı krok˚u, prob´ıhaj´ı veˇsker´e d˚uleˇzit´e ud´alosti ve smyˇcce, jej´ıˇz poˇcet krok˚u lze snadno ovlivnit. Pˇred spuˇstˇen´ım t´eto smyˇcky dojde k inicializaci promˇenn´ych a konstant, kter´e ˇr´ıd´ı bˇeh cel´e simulace.

D´ale se vytvoˇr´ı instance objektu segment, coˇz je koˇrenov´y element stromu. Ten reprezen-tuje prvn´ı nadzemn´ı ˇc´ast kmene.

N´asleduje opakuj´ıc´ı se smyˇcka, kter´a pˇri kaˇzd´em opakov´an´ı vol´a na koˇrenov´y element funkce, zajiˇst’uj´ıc´ı r˚ust cel´eho stromu.

Protoˇze vykreslov´an´ı stromu nemus´ı b´yt poˇzadov´ano v kaˇzd´em kroku, rozhodl jsem se vytvoˇrit promˇennou, kter´a urˇcuje periodu, s n´ıˇz je stav stromu vizualizov´an. Pokaˇzd´e, kdyˇz se prov´ad´ı krok, kter´y je cel´ym n´asobkem t´eto periody, volaj´ı se funkce pro modelov´an´ı stromu, jeho vizualizaci a uloˇzen´ı vznikl´eho obr´azku.

To pˇrin´aˇs´ı v´yraznou ˇcasovou ´usporu hlavnˇe pˇri prov´adˇen´ı delˇs´ıch simulac´ı. Pˇri prov´adˇen´ı v´ıce krok˚u roste poˇcet objekt˚u ve sc´enˇe, kter´e klade vysok´e n´aroky na vytv´aˇren´ı modelu

a jeho vizualizaci.

Z tˇechto d˚uvod˚u jsem od zaˇc´atku oddˇelil od r˚ustov´e funkce samostatn´e funkce modeluj, kter´a pˇri sv´em zavol´an´ı modeluje strukturu kmenu, a pozdˇeji funkce olisti, kter´a strom zakr´yv´a listov´ım. Pro vytvoˇren´ı samotn´e vizualizace a jej´ımu uloˇzen´ı do pamˇeti poˇc´ıtaˇce slouˇz´ı funkce renderuj.

Z´akladn´ı sch´ema fungov´an´ı skriptu je zn´azornˇeno v pˇr´ıloze A.

4.2.2 Vzhled stromov´e struktury

Stromov´a struktura je vytv´aˇrena prostˇrednictv´ım vlastnosti potomci kaˇzd´e instance ob-jektu segment. Vlastnost potomci je inicializov´ana jako pr´azdn´e pole a vkl´adaj´ı se do n´ı odkazy na vˇsechny instance potomk˚u dan´eho objektu.

Je-li pole potomci pr´azdn´e, je segment koncem vˇetve a tak k nˇemu n´aslednˇe pˇri jeho r˚ustu pˇristupuji. Napˇr´ıklad jen konec vˇetve m˚uˇze r˚ust do d´elky, polomˇer konce posledn´ıho segmentu je nulov´y, aby doˇslo k zakonˇcen´ı vˇetve.

Prvn´ı potomek je povaˇzovan´y za pokraˇcov´an´ı vˇetve, proto tyto dva segmenty sd´ılej´ı spoleˇcn´y polomˇer. To realizuji nastaven´ım polomˇeru konce rodiˇcovsk´eho segmentu podle polomˇeru zaˇc´atku prvn´ıho potomka. Vˇsechny ostatn´ı potomci segmentu jsou odnoˇze vˇetve a jejich polomˇer je odliˇsn´y od rodiˇcovsk´eho segmentu (obr. 8).

4.2.3 Struktura ˇr´ıd´ıc´ıch dat

Pro chod simulace jsou potˇreba r˚uzn´a data. Aˇckoli z program´atorsk´eho hlediska by se daly rozdˇelit jako lok´aln´ı a glob´aln´ı promˇenn´e, pro srozumitelnost jejich pouˇzit´ı v simulaci jsem je rozdˇelil do tˇr´ı z´akladn´ıch skupin:

1. data ˇr´ıd´ıc´ı simulaci se t´ykaj´ı samotn´eho procesu simulace a ovlivˇnuj´ı, kolik krok˚u simulace vypoˇc´ıt´a a periodu, s n´ıˇz se budou sn´ımky vizualizovat a ukl´adat. Jejich

Obr´azek 8: Popis vˇetve z datov´eho pohledu

m´ısto je hned na zaˇc´atku skriptu, aby bylo moˇzn´e je snadno naj´ıt a modifikovat.

2. glob´aln´ı data t´ykaj´ıc´ı se simulace obsahuj´ı hodnoty, kter´e ovlivˇnuj´ı strom jako celek a jsou tedy pro cel´y strom vˇzdy stejn´e. Tato data se nach´az´ı na zaˇc´atku k´odu a jejich zmˇenou se ovlivˇnuje chov´an´ı stromu.

Zde uloˇzen´a data jsou napˇr´ıklad citlivost stromu na svˇetlo, vliv svˇetla na tvarov´an´ı stromu, minim´aln´ı d´elky vˇetv´ı pˇred t´ım, neˇz se smˇej´ı vˇetvit. D´ale sem patˇr´ı poloha svˇetla a pr˚uˇrez vˇetv´ı.

3. lok´aln´ı data t´ykaj´ıc´ı se simulace se t´ykaj´ı kaˇzd´eho konkr´etn´ıho segmentu vˇetve.

Tyto hodnoty jsou definov´any jako atributy objektu segment.

K tˇemto vlastnostem nem´a uˇzivatel pˇr´ıstup, protoˇze je spravuje samotn´y skript prostˇrednictv´ım funkc´ı r˚ust, kter´a je modifikuje podle pr˚ubˇehu r˚ustu a n´aslednˇe za-pisuje, a modeluj, kter´a na z´akladˇe pˇreˇcten´ych informac´ı vytv´aˇr´ı model stromu.

Kaˇzd´y segment m´a napˇr´ıklad sv˚uj vˇek, zdrav´ı, sv´e potomky, pozici v prostoru urˇcenou jeho souˇradnicemi na os´ach x, y a z, ´uhly rotace a dalˇs´ı vlastnosti.

4.2.4 R˚ust stromu

Na zaˇc´atku bˇehu programu je vytvoˇrena instance objektu segment, kter´a reprezentuje cel´y strom. Na tento strom je v kaˇzd´em kroku simulace vol´ana jej´ı funkce r˚ust. Ta prov´ad´ı vˇsechny zmˇeny spojen´e s r˚ustem na tento element a n´aslednˇe rekurzivnˇe pro vˇsechny jeho potomky, ˇc´ımˇz projde cel´ym stromem.

Protoˇze v tuto chv´ıli je c´ılem vytvoˇrit skript, kter´y vygeneruje data pro modelov´an´ı stromu bez vlivu simulace, prob´ıh´a vˇetˇsina v´ypoˇct˚u na z´akladˇe konstantn´ıch nebo n´ahodn´ych ˇc´ısel. To je vhodn´e hlavnˇe pro testov´an´ı dalˇs´ıch funkc´ı.

Pˇresto se jiˇz v t´eto ˇc´asti uk´azala potˇreba variabilnˇejˇs´ıho apar´atu pro generov´an´ı nov´ych vˇetv´ı: nov´y segment je definov´an pozic´ı sv´eho zaˇc´atku, kter´y se snadno spoˇc´ıt´a z informac´ı o jeho pˇredch˚udci jako jeho konec. Jin´a situace nast´av´a pˇri urˇcov´an´ı jeho smˇeru. Rozd´ıl je mezi pokraˇcov´an´ım vˇetve, kter´e by mˇelo ve velk´e m´ıˇre navazovat na smˇer sv´eho pˇredch˚udce, a odnoˇz´ı, kter´a naopak mus´ı v´yraznˇe vyboˇcovat.

Reˇsen´ım t´eto situace bylo vytvoˇren´ı dvou rozd´ıln´ˇ ych funkc´ı, z nichˇz kaˇzd´a generuje jin´e hodnoty. Pˇrestoˇze v t´eto chv´ıli se m˚uˇze zd´at takov´eto ˇreˇsen´ı zbyteˇcn´e (funkce se liˇs´ı pouze v rozsahu generovan´ych hodnot), bylo jiˇz v tuto chv´ıli jasn´e, ˇze v´ysledn´y k´od by mˇel k obˇema situac´ım pˇristupovat velmi odliˇsnˇe a proto bude vhodn´e pouˇz´ıvat dvˇe samostatn´e funkce.

Tak´e je potˇreba odliˇsnˇe generovat odnoˇz od vertik´aln´ıho segmentu (kmen) a od ver-tik´aln´ıho segmentu (vˇetev). Zat´ımco od kmenu se vˇetve mohou vydat libovoln´ym smˇerem a je ˇz´adouc´ı, aby rostly pokud moˇzno vˇsemi smˇery rovnomˇernˇe a se stejn´ym n´aklonem, z horizont´aln´ı vˇetve jej´ı odnoˇze nejˇcastˇeji smˇeˇruj´ı pouze do stran.

Dalˇs´ım faktorem, kter´y byl jiˇz v t´eto f´azi vyuˇzit, je princip r˚ustu vˇetv´ı. Zat´ımco do ˇs´ıˇrky rostou vˇsechny vˇetve, do d´elky rostou pouze jejich konce. Proto jsem pˇridal omezen´ı, ˇze d´elka se m˚uˇze zvˇetˇsovat pouze v pˇr´ıpadˇe, ˇze segment nem´a ˇz´adn´e potomky.

Protoˇze se ale vˇetev m˚uˇze v kaˇzd´em kroku vˇetvit, aˇckoli za jeden krok dojde k pouze mal´e zmˇenˇe d´elky, stanovil jsem dalˇs´ı pravidlo, kter´e umoˇzˇnuje vˇetven´ı aˇz po dosaˇzen´ı jist´e limitn´ı minim´aln´ı d´elky.

Tuto vlastnost jsem pozdˇeji pro dosaˇzen´ı bohatˇs´ı horizont´aln´ı struktury stromu rozdˇelil na dvˇe, pro horizont´aln´ı a vertik´aln´ı segmenty. To zajiˇst’uje dostateˇcnou vzd´alenost mezi jednotliv´ymi patry vˇetv´ı a z´aroveˇn o nˇeco hustˇejˇs´ı vˇetvov´ı v jednotliv´ych patrech.

Related documents