16 int main(int argc, char **argv) {
18 int w = 1000, h = 1000;
19 Universe universe(nb_heur + 1, w, h);
23 scalar_t xs[nb], ys[nb];
24 for(int k = 0; k < nb; k++) {
25 scalar_t alpha, radius;
27 alpha = - (M_PI / scalar_t(nb/2)) * k;
30 alpha = - (M_PI / scalar_t(nb/2)) * (nb - k - 1);
33 xs[k] = scalar_t(w)/2 + radius * cos(-alpha);
34 ys[k] = scalar_t(h)/2 + radius * sin(-alpha);
37 p = new Polygon(1.0, 0.0, 0.0, 0.0, xs, ys, nb);
38 p->set_position(scalar_t(w/2), scalar_t(h) * 0.75, 0);
39 p->set_speed(0, 0, 0);
40 universe.initialize(p);
41 universe.add_polygon(p);
44 Polygon *blocks[nb_heur];
46 for(int i = 0; i < nb_heur; i++) {
48 int nb_max_edges = 10;
49 int xt[nb_max_edges * nb_max_edges], yt[nb_max_edges * nb_max_edges];
50 int used[nb_max_edges * nb_max_edges];
54 for(int k = 0; k < nb_max_edges * nb_max_edges; k++) {
58 while(!used[x + nb_max_edges * y]) {
59 used[x + nb_max_edges * y] = 1;
62 switch(int(drand48() * 4)) {
70 else if(x >= nb_max_edges) x = nb_max_edges-1;
72 else if(y >= nb_max_edges) y = nb_max_edges-1;
74 fail = (n < 10) || (x != 0) || (y != 0);
77 scalar_t xs[nb_max_edges], ys[nb_max_edges];
79 for(int l = 0; l < n; l++) {
80 int pl = (l + n - 1)%n, nl = (l + 1)%n;
81 if(xt[nl] - xt[l] != xt[l] - xt[pl] || yt[nl] - yt[l] != yt[l] - yt[pl]) {
82 xs[nb_edges] = scalar_t(xt[l]) * 25;
83 ys[nb_edges] = scalar_t(yt[l]) * 25;
88 cout << "n = " << n << " nb_edges = " << nb_edges << endl;
90 scalar_t red, green, blue;
92 red = scalar_t(16 * int(drand48() * 16))/255.0;
93 green = scalar_t(16 * int(drand48() * 16))/255.0;
94 blue = scalar_t(16 * int(drand48() * 16))/255.0;
95 } while((red > 0.1 && green > 0.1 && blue > 0.1) ||
96 (red < 0.9 && green < 0.9 && blue < 0.9));
97 blocks[i] = new Polygon(1.0, red, green, blue, xs, ys, nb_edges);
99 blocks[i]->set_position(drand48() * w * 0.9 + w * 0.05, drand48() * 3 * h / 4 + h/8, M_PI * drand48());
100 blocks[i]->set_speed(0, 0, 0);
101 // universe.initialize(blocks[i]);
102 for(int j = 0; j < i + 1; j++) {
103 universe.initialize(blocks[j]);
105 } while(universe.collide(blocks[i]));
106 universe.add_polygon(blocks[i]);
107 cout << "added " << i+1 << " blocks." << endl;
112 for(int n = 0; n < 100000; n++) {
113 for(int i = 0; i < nb_heur; i++) {
114 blocks[i]->apply_force(dt, blocks[i]->_center_x, blocks[i]->_center_y, 0, 0.25);
119 sprintf(buffer, "/tmp/mash_%06d.fig", n);
120 XFigTracer tracer(buffer);
121 universe.print_xfig(&tracer);
122 cout << "Wrote " << buffer << endl;
126 XFigTracer tracer("/tmp/mash.fig");
127 universe.print_xfig(&tracer);