2 ////////////////////////////////////////////////////////////////////
5 // Written by Francois Fleuret //
6 // Contact <francois.fleuret@idiap.ch> for comments & bug reports //
9 ////////////////////////////////////////////////////////////////////
11 // for i in {0..49}; do u=$(printf %03d $i); mkdir $u && mv dyn_${u}* ${u}; done
27 #include "simple_window.h"
31 #include "manipulator.h"
32 #include "intelligence.h"
33 #include "canvas_cairo.h"
35 void generate_png(Universe *universe, scalar_t scale, FILE *file) {
36 CanvasCairo canvas(scale, universe->width(), universe->height());
37 canvas.set_line_width(1.0 / scale);
38 universe->draw(&canvas);
39 canvas.write_png(file);
42 int main(int argc, char **argv) {
43 const scalar_t world_width = 400;
44 const scalar_t world_height = 400;
45 const scalar_t grab_start_x = world_width * 0.5;
46 const scalar_t grab_start_y = world_height * 0.75;
47 const int nb_blocks = 1;
48 const scalar_t block_size = 80;
50 const scalar_t dt = 0.1;
51 const int nb_steps = 5;
52 const int nb_iterations_per_steps = 20;
55 Polygon *grabbed_polygon;
57 if(argc < 2 || argc > 3) {
58 cerr << argv[0] << " <nb pairs to generate> [<dir> [<seed>]]" << endl;
62 int nb_pairs = atoi(argv[1]);
64 char dir[1024] = "/tmp/";
67 strncpy(dir, argv[2], sizeof(dir) / sizeof(char) - 1);
71 srand48(atoi(argv[1]));
74 universe = new Universe(10, world_width, world_height);
76 for(int n = 0; n < nb_pairs; n++) {
77 if(n%1000 == 0) { cout << "Example #" << n+1 << endl; }
82 const int nb_attempts_max = 100;
85 for(int u = 0; u < nb_blocks; u++) {
105 scalar_t delta = block_size / sqrt(2.0);
106 scalar_t object_center_x = delta + (world_width - 2 * delta) * drand48();
107 scalar_t object_center_y = delta + (world_height - 2 * delta) * drand48();
108 scalar_t red, green, blue;
113 pol = new Polygon(0.5,
115 x, y, sizeof(x)/sizeof(scalar_t));
116 pol->set_position(object_center_x, object_center_y, M_PI * 2 * drand48());
117 pol->set_speed(0, 0, 0);
118 universe->initialize_polygon(pol);
120 } while(nb_attempts < nb_attempts_max && universe->collide(pol));
122 if(nb_attempts == nb_attempts_max) {
128 universe->add_polygon(pol);
132 grabbed_polygon = universe->pick_polygon(grab_start_x, grab_start_y);
133 } while(!grabbed_polygon);
135 const scalar_t scaling = 0.16;
137 CanvasCairo grab_trace(scaling, world_width, world_height);
141 sprintf(buffer, "%s/%03d/", dir, n/1000);
145 scalar_t grab_relative_x = grabbed_polygon->relative_x(grab_start_x, grab_start_y);
146 scalar_t grab_relative_y = grabbed_polygon->relative_y(grab_start_x, grab_start_y);
150 scalar_t xp[n], yp[n];
151 for(int k = 0; k < n; k++) {
152 scalar_t radius = 1/scaling;
153 scalar_t alpha = 2 * M_PI * scalar_t(k) / scalar_t(n);
154 xp[k] = grab_start_x + radius * cos(alpha);
155 yp[k] = grab_start_y + radius * sin(alpha);
157 grab_trace.set_drawing_color(0.0, 0.0, 0.0);
158 grab_trace.set_line_width(2.0);
159 grab_trace.draw_polygon(1, n, xp, yp);
162 for(int s = 0; s < nb_steps; s++) {
165 sprintf(buffer, "%s/%03d/dyn_%06d_world_%03d.png", dir, n/1000, n, s);
166 FILE *file = fopen(buffer, "w");
167 generate_png(universe, scaling, file);
171 for(int i = 0; i < nb_iterations_per_steps; i++) {
172 scalar_t xf = grabbed_polygon->absolute_x(grab_relative_x, grab_relative_y);
173 scalar_t yf = grabbed_polygon->absolute_y(grab_relative_x, grab_relative_y);
174 grabbed_polygon->apply_force(dt, xf, yf, 0.0, -1.0);
175 universe->update(dt);
181 sprintf(buffer, "%s/%03d/dyn_%06d_grab.png", dir, n/1000, n);
182 FILE *file = fopen(buffer, "w");
183 grab_trace.write_png(file);