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
% t u r t l e g r a p h i c s i n t e r p r e t e r
% a r g u m e n t s :
% 1. o r d e r to be e x e c u t e d
% 2. T u r t l e p o s i t i o n s t a c k
% 3. S t e p l e n g t h
% 4 d e f a u l t t u r n a n g l e
% r e t u r n s new t u r t l e p o s i t i o n s t a c k
f u n c t i o n p o s 1 = p r o c e s s ( char , pos , step , a l p h a )
% f o r w a r d and d r a w a l i n e
if ( c h a r == ’ F ’ || c h a r == ’ R ’ || c h a r == ’ L ’) xn = pos (1) + s t e p * cos( pos ( 3 ) ) ; yn = pos (2) + s t e p * sin( pos ( 3 ) ) ;
p l o t([ pos (1) , xn ] ,[ pos (2) , yn ] , ’ c o l o r ’, ’ g ’);
h o l d on ;
p o s 1 = [ xn , yn , pos (3) , pos (4:end)];
% f o r w a r d but don ’ t d r a w l i n e e l s e i f ( c h a r == ’ f ’)
xn = pos (1) + s t e p * cos( pos ( 3 ) ) ; yn = pos (2) + s t e p * sin( pos ( 3 ) ) ; p o s 1 = [ xn , yn , pos (3) , pos (4:end)];
% t u r n r i g h t
e l s e i f ( c h a r == ’ + ’)
p o s 1 = [ pos (1) , pos (2) , pos (3) + alpha , pos (4:end)];
% t u r n l e f t
e l s e i f ( c h a r == ’ - ’)
p o s 1 = [ pos (1) , pos (2) , pos (3) - alpha , pos (4:end)];
% s a v e p o s i t i o n / p u s h it on the s t a c k e l s e i f ( c h a r == ’ [ ’)
p o s 1 = [ pos (1:3) , pos ];
% r e s t o r e p o s i t i o n / pop f r o m the s t a c k
1
e l s e i f ( c h a r == ’ ] ’)
if l e n g t h( pos ) >=6
% in c a s e t h e r is o n l y one p o s i t i o n
p o s 1 = pos (4:end);
end e l s e
p o s 1 = pos ;
% i g n o r e o t h e r c o m m a n d s end
end
Grafika żółwia, wyświetlanie całego napisu: renderString.m
%
% L - s y s t e m r e n d e r i n g
f u n c t i o n r e n d e r S t r i n g ( str , step , a l p h a ) f i g u r e( 1 ) ;
h o l d off ;
% x , y , a l p h a pos = [0 ,0 ,pi/ 2 ] ; for i =1:l e n g t h( str )
pos = p r o c e s s ( str ( i ) , pos , step , a l p h a );
end
% e q u a l f o r c e s the a s p e c t r a t i o x / y = 1
a x i s([1 ,2] , ’ a u t o x ’, ’ a u t o y ’,’ s q u a r e ’, ’ e q u a l ’);
end
Generowanie napisu na podstawie aksjomatu: genString.m
% i t e r a t i v e l y r e w r i t e s the a x i o m a c c o r d i n g to the r u l e s
%
f u n c t i o n s = g e n S t r i n g ( axiom , rules , i t e r s ) s = a x i o m ;
for ( i =1: i t e r s ) t e m p s = ’ ’;
for j = 1:l e n g t h( s )
q = f i n d R u l e ( s ( j ) , r u l e s );
t e m p s = s t r c a t ( temps , q );
end
s = t e m p s ; end
end
Funkcja pomocnicza — wyszukiwanie właściwej reguły zastępowania: findRule.m f u n c t i o n ret = f i n d R u l e ( char , r u l e s )
ret = c h a r ;
% T a s k : r e w r i t e the r u l e s so it can use b i n a r y s e a r c h
%
for i =1: l e n g t h( r u l e s ( ) ) ;
if ( r u l e s { i } ( 1 ) == c h a r )
ret = r u l e s { i } ( 3 :end);
end end
end
Główna funkcja: LS.m f u n c t i o n LS ()
a x i o m = ’ F ’;
i t e r s = 5;
2
s t e p = 1;
r u l e s = {
’ F = FF -[ - F + F + F ] + [ + F - F - F ] ’ };
a l p h a = pi * 2 2 . 5 / 1 8 0 ;
s t r i n g = g e n S t r i n g ( axiom , rules , i t e r s );
s t r i n g
r e n d e r S t r i n g ( string , step , a l p h a ) 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