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

Podobne dokumenty