Algorytmy stochastyczne — laboratorium 04
Transkrypt
Algorytmy stochastyczne — laboratorium 04
Algorytmy stochastyczne — laboratorium 04 Jarosław Piersa 2014-03-14 1 Projekty 1.1 Systemy Liendenmayera na płaszczyźnie (1p) Napisz interpreter systemów Liendenmayera ze stosem wraz z możliwością wyświetlania. Pomysły na rozszerzenia: • systemy w 3d zamiast 2d (żółw ze skrzydłami) • systmey kontekstowe • systemy stochastyczne 1.2 Renderowanie terenu (1p) Napisz silnik generujący mapę wysokości terenu i wyświetlający teren w R3 . 1.3 Renderowanie lasu (2p) Połączenie powyższych. Napisz silnik generujący teren pokryty roślinnością (lasy lub łąki). 2 Prosta implementacja LS w Octave Grafika żółwia, przetwarzanie poleceń: process.m % turtle graphics interpreter % arguments : % 1. order to be executed % 2. Turtle position stack % 3. Step length % 4 default turn angle % returns new turtle position stack function pos1 = process ( char , pos , step , alpha ) % forward and draw a line if ( char == ’F ’ || char == ’R ’ || char == ’L ’) xn = pos (1) + step * cos ( pos (3)); yn = pos (2) + step * sin ( pos (3)); plot ([ pos (1) , xn ] ,[ pos (2) , yn ] , ’ color ’ , ’g ’ ); hold on ; pos1 = [ xn , yn , pos (3) , pos (4: end )]; % forward but don ’ t draw line elseif ( char == ’f ’) xn = pos (1) + step * cos ( pos (3)); yn = pos (2) + step * sin ( pos (3)); pos1 = [ xn , yn , pos (3) , pos (4: end )]; % turn right elseif ( char == ’+ ’) pos1 = [ pos (1) , pos (2) , pos (3) + alpha , pos (4: end )]; % turn left elseif ( char == ’ - ’) pos1 = [ pos (1) , pos (2) , pos (3) - alpha , pos (4: end )]; % save position / push it on the stack elseif ( char == ’[ ’) pos1 = [ pos (1:3) , pos ]; % restore position / pop from the stack 1 elseif ( char == ’] ’) if length ( pos ) >=6 % in case ther is only one position pos1 = pos (4: end ); end else pos1 = pos ; % ignore other commands end end Grafika żółwia, wyświetlanie całego napisu: renderString.m % % L - system rendering function renderString ( str , step , alpha ) figure (1); hold off ; % x , y , alpha pos = [0 ,0 , pi /2]; for i =1: length ( str ) pos = process ( str ( i ) , pos , step , alpha ); end % equal forces the aspect ratio x / y = 1 axis ([1 ,2] , ’ autox ’ , ’ autoy ’ , ’ square ’ , ’ equal ’ ); end Generowanie napisu na podstawie aksjomatu: genString.m % iteratively rewrites the axiom according to the rules % function s = genString ( axiom , rules , iters ) s = axiom ; for ( i =1: iters ) temps = ’ ’; for j = 1: length ( s ) q = findRule ( s ( j ) , rules ); temps = strcat ( temps , q ); end s = temps ; end end Funkcja pomocnicza — wyszukiwanie właściwej reguły zastępowania: findRule.m function ret = findRule ( char , rules ) ret = char ; % Task : rewrite the rules so it can use binary search % for i =1: length ( rules ()); if ( rules { i }(1) == char ) ret = rules { i }(3: end ); end end end Główna funkcja: LS.m function LS () axiom = ’F ’; iters = 5; 2 step = 1; rules = { ’F = FF -[ - F + F + F ]+[+ F -F - F ] ’ }; alpha = pi * 22.5 / 180; string = genString ( axiom , rules , iters ); string renderString ( string , step , alpha ) end Ćwiczenia • dopisz stochastyczną wersję przepisywania: – dopuszczane są dwie (lub więcej) reguły zastępowania tego samego znaku: X => ABC X => BC – system wybiera losową z nich. – jeżeli jest tylko jedna reguła, to zawsze ją wybieramy. Jeżeli nie ma żadnych to przepisujemy trywialnie: Q => Q • dopisz sterowanie żółwiem w R3 (latający żółw) – położenie żółwia jest określane przez trójkę liczb (x, y, z), – orientacja jest określana przez parę liczb α, β (obrót i nachylenie, współrzędne sferyczne) lub trójkę RPY (ang. roll pitch yaw, obroty „lotnicze”), – obroty: ∗ azymut i nachylenie (sferyczne) ∗ wokół osi OX, OY i OZ (roll pich yaw) • różne interpretacje i renderowanie: np. F — łodyga podlegająca wzrostowi, X pąk w którym tworzy się kwiat (nie podlega zastępowaniu) 3