ed85d2c9a1d87a6d5e41c6d5660375e692b07210
[universe.git] / mash.cc
1 // -*- compile-command:"g++ -lX11 -Wall -g -O3 -o mash misc.o universe.o polygon.o mash.cc -L/usr/X11R6/lib/"; -*-
2
3 #include <iostream>
4 #include <fstream>
5 #include <cmath>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <stdint.h>
9 #include <errno.h>
10 #include <string.h>
11
12 using namespace std;
13
14 #include "misc.h"
15 #include "universe.h"
16
17 int main(int argc, char **argv) {
18   int nb_heur = 75;
19   int w = 1000, h = 1000;
20   Universe universe(nb_heur + 1, w, h);
21
22   {
23     int nb = 100;
24     scalar_t xs[nb], ys[nb];
25     for(int k = 0; k < nb; k++) {
26       scalar_t alpha, radius;
27       if(k < nb/2) {
28         alpha = - (M_PI / scalar_t(nb/2)) * k;
29         radius = 400;
30       } else {
31         alpha = - (M_PI / scalar_t(nb/2)) * (nb - k - 1);
32         radius = 350;
33       }
34       xs[k] = scalar_t(w)/2 + radius * cos(-alpha);
35       ys[k] = scalar_t(h)/2 + radius * sin(-alpha);
36     }
37     Polygon *p;
38     p = new Polygon(1.0, 0.5, 0.5, 0.5, xs, ys, nb);
39     p->set_position(scalar_t(w/2), scalar_t(h) * 0.75, 0);
40     p->set_speed(0, 0, 0);
41     universe.initialize(p);
42     universe.add_polygon(p);
43   }
44
45   Polygon *blocks[nb_heur];
46
47   for(int i = 0; i < nb_heur; i++) {
48
49     int nb_max_edges = 10;
50     int xt[nb_max_edges * nb_max_edges], yt[nb_max_edges * nb_max_edges];
51     int used[nb_max_edges * nb_max_edges];
52     int fail, x, y, n;
53     do {
54       fail = 0;
55       for(int k = 0; k < nb_max_edges * nb_max_edges; k++) {
56         used[k] = 0;
57       }
58       x = 0; y = 0; n = 0;
59       while(!used[x + nb_max_edges * y]) {
60         used[x + nb_max_edges * y] = 1;
61         xt[n] = x; yt[n] = y;
62         n++;
63         switch(int(drand48() * 4)) {
64         case 0: x++; break;
65         case 1: x--; break;
66         case 2: y++; break;
67         case 3: y--; break;
68         default: abort();
69         }
70         if(x < 0) x = 0;
71         else if(x >= nb_max_edges) x = nb_max_edges-1;
72         if(y < 0) y = 0;
73         else if(y >= nb_max_edges) y = nb_max_edges-1;
74       }
75       fail = (n < 8) || (x != 0) || (y != 0);
76     } while(fail);
77
78     scalar_t xs[nb_max_edges], ys[nb_max_edges];
79     int nb_edges = 0;
80     for(int l = 0; l < n; l++) {
81       int pl = (l + n - 1)%n, nl = (l + 1)%n;
82       if(xt[nl] - xt[l] != xt[l] - xt[pl] || yt[nl] - yt[l] != yt[l] - yt[pl]) {
83         xs[nb_edges] = scalar_t(xt[l]) * 15;
84         ys[nb_edges] = scalar_t(yt[l]) * 15;
85         nb_edges++;
86       }
87     }
88
89     cout << "n = " << n << " nb_edges = " << nb_edges << endl;
90
91     blocks[i] = new Polygon(1.0, 1.0, 1.0, 0.0, xs, ys, nb_edges);
92     do {
93       blocks[i]->set_position(drand48() * w/2 + w/4, drand48() * h/2 + h/4, M_PI * drand48());
94       blocks[i]->set_speed(0, 0, 0);
95       // universe.initialize(blocks[i]);
96       for(int j = 0; j < i + 1; j++) {
97         universe.initialize(blocks[j]);
98       }
99     } while(universe.collide(blocks[i]));
100     universe.add_polygon(blocks[i]);
101     cout << "added " << i+1 << " blocks." << endl;
102   }
103
104   scalar_t dt = 0.1;
105
106   for(int n = 0; n < 100000; n++) {
107     for(int i = 0; i < nb_heur; i++) {
108       blocks[i]->apply_force(dt, blocks[i]->_center_x, blocks[i]->_center_y, 0, 0.25);
109     }
110     universe.update(dt);
111     if(n%1000 == 0) {
112       char buffer[1024];
113       sprintf(buffer, "/tmp/mash_%06d.fig", n);
114       ofstream os(buffer);
115       universe.print_fig(os);
116       cout << "Wrote " << buffer << endl;
117     }
118   }
119
120   ofstream os("/tmp/mash.fig");
121   universe.print_fig(os);
122
123   exit(0);
124 }