Gra w chaos - dyskusja na Forum OWK Opracowanie: Mariusz
Transkrypt
Gra w chaos - dyskusja na Forum OWK Opracowanie: Mariusz
programowanie w C++ dla OWK Gra w chaos - dyskusja na Forum OWK Opracowanie: Mariusz Pihan, Kamil Klarecki oraz Mirosław R. Dudek 1 Streszczenie W ramach zajęć programowania w C++ przedyskutowane zostało zagadnienie gry w chaos Michaela Barnsley’a. Zadaniem grupy jest modyfikacja parametrów gry i stworzenie programu w którym w sposób ciągły przechodzi się pomiędzy fraktalami reprezentującymi różne realizacje algorytmu. W tym rozdziale przedstawione zostaną tylko materiały pomocnicze z dwoma przykładowymi kodami programów w języku C++. W literaturze, a w szczególności w internecie jest mnówstwo dostępnych przykładów realizacji algorytmu gry w chaos. Wystarczy wyguglować słowa “gra w chaos” lub “chaos game”. W przypadku dwóch fraktali na rysunkach poniżej algorytm był następujący. Załóżmy że mamy trzy miasta A,B,C np. w wierzchołkach trójkąta równobocznego (ale może to być dowolny trójkąt) i niezdecydowanego turyste, który początkowo stoi gdzieś blisko środka trójkąta w punkcie P (x0 , y0 ) a potem przy pomocy generatora liczb pseudolosowych wybiera kierunek do jednego z miast i przesuwa się do nowego punktu P (x, y) leżącego w połowie odległości. Algorytm: 1. turysta znajduje się w P (x0 , y0 ) i wybiera losowo jeden z trzech kierunków A, B lub C, 2. turysta przenosi się do nowego punktu P (x, y) o połowę odległości pomiędzy P (x0 , y0 ) a P (xA , yA ), P (xB , yB ) lub P (xC , yC ). 2 A B 0 -0,2 -0,4 -0,6 -0,8 C -1 -0,8 -0,6 -0,4 -0,2 0 Rysunek 1: Wydruk punktów wygenerowanych przez program ChaosGameA.cc. 0,5 C 0,4 0,3 0,2 0,1 C 0 -0,2 A 0 0,2 0,4 B 0,6 Rysunek 2: Wydruk punktów wygenerowanych przez program ChaosGameB.cc. Poniżej znajdują się wydruki kodów programów w C++, ChaosGameA.cc i ChaosGameB.cc. 1 // g r a w c ha os 2 // Turysta l o s o w o w y b i e r a k i e r u n k i do j e d n e g o z t r z e c h m i a s t 3 // ( 1 ) ( 2 ) i ( 3 ) l e z a c y c h w w i e r z c h o l k a c h t r o j k a t a 4 //Za kazdym razem t u r y s t a przesuwa s i e dp p o l o z e n i a 5 // rownego polowe o d l e g l o s c i 6 // do wybranego m i a s t a . 7 // z a p i s u j e m y p o l o z e n i a ( x , y ) t u r y s t y . 8 //Mozna z m i e n i a c r e g u l y o d l e g l o s c i i otrzymywac r o z n e o b r a z y t r a j e k t o r i i t u r y s t y . 9 10 #include <i o s t r e a m > 3 11 #include <c s t d l i b > 12 #include <cmath> 13 14 using namespace s t d ; 15 16 int main ( ) { 17 18 double x1 , y1 , x2 , y2 , x3 , y3 ; // w i e r z c h o l k i t r o j k a t a 19 20 x1 = 0 . 0 ; y1 = 0 . 0 ; 21 x2=x1 + 1 . 0 ; y2=y1 ; 22 x3=(x1+x2 ) / 2 ; y3=y1+s q r t ( 3 . 0 ) / 2 . 0 ; 23 24 25 double x0 , y0 ; // l o s o w e p o l o z e n i e p o c z a t k o w e t u r y s t y 26 27 x0=rand ( ) / ( 1 . 0 +RAND MAX) ; 28 y0=rand ( ) / ( 1 . 0 +RAND MAX) ; 29 30 double x nowe , y nowe ; // nowe p o l o z e n i e 31 32 long Nkrokow =4000; // l i c z b a krokow t u r y s t y 33 long n=0; 34 35 double p1 = 1 . 0 / 3 ; 36 double p2 = 2 . 0 / 3 . 0 ; 37 double rnd ; 38 39 40 while ( n<Nkrokow ) { // k o l e j n e k r o k i t u r y s t y 41 rnd=rand ( ) / ( 1 . 0 +RAND MAX) ; // l i c z b a l o s o w a z p r z e d z i a l u [ 0 , 1 ) 42 i f ( rnd<p1 ) { // wybor p i e r w s z e g o m i a s t a 43 44 x nowe =0.5∗( x0−x1 ) ; 45 y nowe =0.5∗( y0−y1 ) ; 46 47 cout<<x nowe<<"\t"<<y nowe<<e n d l ; 48 } 49 else { 50 rnd=rand ( ) / ( 1 . 0 +RAND MAX) ; 51 i f ( rnd<p2 ) { // wybor d r u g i e g o m i a s t a 52 53 x nowe =0.5∗( x0−x2 ) ; 54 y nowe =0.5∗( y0−y2 ) ; 55 cout<<x nowe<<"\t"<<y nowe<<e n d l ; 56 } 57 e l s e { // wybor t r z e c i e g o m i a s t a − n i e t r z e b a j u z l o s o w a c 58 59 x nowe =0.5∗( x0−x3 ) ; 60 y nowe =0.5∗( y0−y3 ) ; 61 cout<<x nowe<<"\t"<<y nowe<<e n d l ; 62 63 } 64 } 65 x0=x nowe ; y0=y nowe ; 66 n++; // k o l e j n y k r o k 4 67 68 69 } return 0 ; } i program ChaosGameB.cc. 1 // g r a w c ha os 2 // Turysta l o s o w o w y b i e r a k i e r u n k i do j e d n e g o z t r z e c h m i a s t 3 // ( 1 ) ( 2 ) i ( 3 ) l e z a c y c h w w i e r z c h o l k a c h t r o j k a t a 4 //Za kazdym razem po m i a s t a przesuwa s i e o o d l e g l o s c 5 // rowna polowe o d l e g l o s c i 6 // do wybranego m i a s t a . 7 // z a p i s u j e m y p o l o z e n i a ( x , y ) t u r y s t y . 8 //Mozna z m i e n i a c r e g u l y o d l e g l o s c i . 9 10 #include <i o s t r e a m > 11 #include <c s t d l i b > 12 #include <cmath> 13 14 using namespace s t d ; 15 16 int main ( ) { 17 18 double x1 , y1 , x2 , y2 , x3 , y3 ; // w i e r z c h o l k i t r o j k a t a 19 20 x1 = 0 . 0 ; y1 = 0 . 0 ; 21 x2=x1 + 1 . 0 ; y2=y1 ; 22 x3=(x1+x2 ) / 2 ; y3=y1+s q r t ( 3 . 0 ) / 2 . 0 ; 23 24 25 double x0 , y0 ; // l o s o w e p o l o z e n i e p o c z a t k o w e t u r y s t y 26 27 x0=rand ( ) / ( 1 . 0 +RAND MAX) ; 28 y0=rand ( ) / ( 1 . 0 +RAND MAX) ; 29 30 double x nowe , y nowe ; // nowe p o l o z e n i e 31 32 long Nkrokow =4000; // l i c z b a krokow t u r y s t y 33 long n=0; 34 35 double p1 = 1 . 0 / 3 ; 36 double p2 = 2 . 0 / 3 . 0 ; 37 double rnd ; 38 39 while ( n<Nkrokow ) { // k o l e j n e k r o k i t u r y s t y 40 rnd=rand ( ) / ( 1 . 0 +RAND MAX) ; // l i c z b a l o s o w a z p r z e d z i a l u [ 0 , 1 ) 41 i f ( rnd<p1 ) { // wybor p i e r w s z e g o m i a s t a 42 43 y nowe =0.5∗( y0−y1 ) ; 44 x nowe =0.5∗( x0−x1 ) ; 45 46 cout<<x nowe<<"\t"<<y nowe<<e n d l ; 47 } 48 else { 49 rnd=rand ( ) / ( 1 . 0 +RAND MAX) ; 50 i f ( rnd<p2 ) { // wybor d r u g i e g o m i a s t a 51 5 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 y nowe =0.5∗( y0−y2 ) ; x nowe =0.5∗( x2−x0 ) ; cout<<x nowe<<"\t"<<y nowe<<e n d l ; } e l s e { // wybor t r z e c i e g o m i a s t a − n i e t r z e b a j u z l o s o w a c y nowe =0.5∗( y3−y0 ) ; x nowe =0.5∗( x3−x0 ) ; cout<<x nowe<<"\t"<<y nowe<<e n d l ; } } x0=x nowe ; y0=y nowe ; n++; // k o l e j n y k r o k } return 0 ; } 6