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

Podobne dokumenty