]> mj.ucw.cz Git - anim.git/blob - a.pl
Vsechny tri.
[anim.git] / a.pl
1 #!/usr/bin/perl -W
2
3 use strict;
4 use warnings;
5
6 use Gtk2 -init;
7 use Cairo;
8
9 use AA;
10 use AA::Gfx;
11 use AA::UI;
12 use AA::Graph;
13 use AA::Net;
14 use AA::Anim;
15
16 my $ui = AA::UI->new('');
17
18 my $back = AA::Background->new('bg');
19
20 my $title = AA::Label->new('title');
21 $title->MultiSet(
22         'text' => 'Goldbergův algoritmus',
23         'size' => 60,
24         'x' => 1024/2,
25         'y' => 80,
26 );
27
28 my @v;
29 for (my $i=0; $i<5; $i++) {
30         my $v = AA::NetV->new("v$i");
31         $v->MultiSet(
32                 'x' => 100 + 180*$i,
33                 'y0' => 600,
34                 'label' => ($i == 0) ? "Z" : ($i == 4) ? "S" : $i,
35                 'h' => ($i == 0) ? 5 : 0,
36         );
37         push @v, $v;
38 }
39
40 my @e;
41 for (my $i=0; $i<4; $i++) {
42         my $e = AA::NetE->new("e$i", $v[$i], $v[$i+1]);
43         $e->Set('c', 5);
44         $e->Set('f', 0);
45         push @e, $e;
46 }
47
48 for (my $i=1; $i<@v; $i++) {
49         my $ii = $i;    # need to keep a copy in the current closure
50         $v[$i]->Bind('xs', sub { $e[$ii-1]->Get('f') - (($ii == @v-1) ? 0 : $e[$ii]->Get('f')) });
51 }
52 $v[4]->{XS}->Set('color', [0,1,0]);
53
54 sub flow($$) {
55         my ($i,$df) = @_;
56         $e[$i]->Set('f', $e[$i]->Get('f') + $df);
57 }
58
59 sub up($) {
60         my ($i) = @_;
61         $v[$i]->Set('h', $v[$i]->Get('h') + 1);
62 }
63
64 sub hint($) {
65         my ($h) = @_;
66         for (my $i=0; $i<@v; $i++) {
67                 $v[$i]->Set('hint', $i == $h);
68         }
69 }
70
71 my $scenario;
72
73 if (!@ARGV || $ARGV[0] eq "1") {
74         $scenario = [
75                 sub { flow(0, 5);       hint(1); },
76                 sub { up(1); },
77                 sub { flow(1, 5);       hint(2); },
78                 sub { up(2); },
79                 sub { flow(2, 5);       hint(3); },
80                 sub { up(3); },
81                 sub { flow(3, 5);       hint(-1); },
82         ];
83 } elsif ($ARGV[0] eq "2") {
84         $title->Set('text', "Goldberg podruhé");
85         for (my $i=0; $i<@v-1; $i++) {
86                 $e[$i]->Set('c', 5-$i);
87         }
88         $scenario = [
89                 sub { flow(0, 5); hint(1); },
90                 sub { up(1); },
91                 sub { flow(1, 4); hint(2); },
92                 sub { up(2); },
93                 sub { flow(2, 3); hint(3); },
94                 sub { up(3); },
95                 sub { flow(3, 2); },
96                 sub { up(3); },
97                 sub { flow(2, -1); hint(2); },
98                 sub { up(2); },
99                 sub { flow(1, -1); hint(1); },
100                 sub { up(1); },
101                 sub { up(1); },
102                 sub { flow(1, 1); },
103                 sub { up(1); },
104                 sub { up(1); },
105                 sub { up(1); },
106                 sub { flow(0, -1); hint(2); },
107                 sub { up(2); },
108                 sub { flow(2, 1); hint(3); },
109                 sub { up(3); },
110                 sub { up(3); },
111                 sub { flow(2, -1); hint(2); },
112                 sub { up(2); },
113                 sub { up(2); },
114                 sub { flow(2, 1); hint(3); },
115                 sub { up(3); },
116                 sub { up(3); },
117                 sub { flow(2, -1); hint(2); },
118                 sub { up(2); },
119                 sub { up(2); },
120                 sub { flow(2, 1); },
121                 sub { flow(1, -1); hint(1); },
122                 sub { flow(0, -1); hint(3); },
123                 sub { up(3); },
124                 sub { up(3); },
125                 sub { flow(2, -1); hint(2); },
126                 sub { flow(1, -1); hint(1); },
127                 sub { flow(0, -1); hint(-1); },
128         ];
129 } elsif ($ARGV[0] eq "3") {
130         $title->Set('text', "Goldberg s nejvyšším vrcholem");
131         for (my $i=0; $i<@v-1; $i++) {
132                 $e[$i]->Set('c', 5-$i);
133         }
134         $scenario = [
135                 sub { flow(0, 5); hint(1); },
136                 sub { up(1); },
137                 sub { flow(1, 4); },
138                 sub { up(1); },
139                 sub { up(1); },
140                 sub { up(1); },
141                 sub { up(1); },
142                 sub { up(1); },
143                 sub { flow(0, -1); hint(2); },
144                 sub { up(2); },
145                 sub { flow(2, 3); },
146                 sub { up(2); },
147                 sub { up(2); },
148                 sub { up(2); },
149                 sub { up(2); },
150                 sub { up(2); },
151                 sub { up(2); },
152                 sub { flow(1, -1); hint(1); },
153                 sub { flow(0, -1); hint(3); },
154                 sub { up(3); },
155                 sub { flow(3, 2); },
156                 sub { up(3); },
157                 sub { up(3); },
158                 sub { up(3); },
159                 sub { up(3); },
160                 sub { up(3); },
161                 sub { up(3); },
162                 sub { up(3); },
163                 sub { flow(2, -1); hint(2); },
164                 sub { flow(1, -1); hint(1); },
165                 sub { flow(0, -1); hint(-1); },
166         ];
167 } else {
168         die "What do you want?\n";
169 }
170
171 $ui->RunScenario($scenario, 1);