2 ////////////////////////////////////////////////////////////////////
5 // Written by Francois Fleuret //
6 // Contact <francois.fleuret@idiap.ch> for comments & bug reports //
9 ////////////////////////////////////////////////////////////////////
24 #include "simple_window.h"
28 #include "manipulator.h"
29 #include "intelligence.h"
30 #include "canvas_cairo.h"
32 void generate_png(Universe *universe, scalar_t scale, FILE *file) {
33 CanvasCairo canvas(scale, universe->width(), universe->height());
34 universe->draw(&canvas);
35 canvas.write_png(file);
38 int main(int argc, char **argv) {
39 scalar_t world_width = 400;
40 scalar_t world_height = 400;
41 scalar_t grab_start_x = world_width * 0.5;
42 scalar_t grab_start_y = world_height * 0.75;
45 Polygon *grabbed_polygon;
47 if(argc < 2 || argc > 3) {
48 cerr << argv[0] << " <nb pairs to generate> [<seed>]" << endl;
52 int nb_pairs = atoi(argv[1]);
55 srand48(atoi(argv[1]));
58 universe = new Universe(10, world_width, world_height);
60 for(int n = 0; n < nb_pairs; n++) {
61 cout << "Example " << n << endl;
66 const int nb_attempts_max = 100;
69 for(int u = 0; u < 10; u++) {
75 scalar_t square_size = 80;
91 scalar_t delta = square_size / sqrt(2.0);
92 scalar_t object_center_x = delta + (world_width - 2 * delta) * drand48();
93 scalar_t object_center_y = delta + (world_height - 2 * delta) * drand48();
94 scalar_t red, green, blue;
95 red = drand48() * 0.8;
99 pol = new Polygon(0.5,
101 x, y, sizeof(x)/sizeof(scalar_t));
102 pol->set_position(object_center_x, object_center_y, M_PI * 2 * drand48());
103 pol->set_speed(0, 0, 0);
104 universe->initialize_polygon(pol);
106 } while(nb_attempts < nb_attempts_max && universe->collide(pol));
108 if(nb_attempts == nb_attempts_max) {
114 universe->add_polygon(pol);
118 grabbed_polygon = universe->pick_polygon(grab_start_x, grab_start_y);
119 } while(!grabbed_polygon);
121 const scalar_t scaling = 0.16;
125 sprintf(buffer, "/tmp/universe_%03d_0.png", n);
126 FILE *file = fopen(buffer, "w");
127 generate_png(universe, scaling, file);
130 scalar_t grab_relative_x = grabbed_polygon->relative_x(grab_start_x, grab_start_y);
131 scalar_t grab_relative_y = grabbed_polygon->relative_y(grab_start_x, grab_start_y);
134 for(int i = 0; i < 500; i++) {
135 scalar_t xf = grabbed_polygon->absolute_x(grab_relative_x, grab_relative_y);
136 scalar_t yf = grabbed_polygon->absolute_y(grab_relative_x, grab_relative_y);
137 grabbed_polygon->apply_force(dt, xf, yf, 0.0, -1.0);
138 universe->update(dt);
143 sprintf(buffer, "/tmp/universe_%03d_1.png", n);
144 FILE *file = fopen(buffer, "w");
145 generate_png(universe, scaling, file);