c338a1ee626bf9524aa0e372150325ad1a597466
[universe.git] / generate.cc
1
2 ////////////////////////////////////////////////////////////////////
3 // START_IP_HEADER                                                //
4 //                                                                //
5 // Written by Francois Fleuret                                    //
6 // Contact <francois.fleuret@idiap.ch> for comments & bug reports //
7 //                                                                //
8 // END_IP_HEADER                                                  //
9 ////////////////////////////////////////////////////////////////////
10
11 #include <iostream>
12 #include <fstream>
13 #include <cmath>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <stdint.h>
17 #include <errno.h>
18 #include <string.h>
19
20 using namespace std;
21
22 #include "misc.h"
23 #include "task.h"
24 #include "simple_window.h"
25 #include "universe.h"
26 #include "plotter.h"
27 #include "retina.h"
28 #include "manipulator.h"
29 #include "intelligence.h"
30 #include "canvas_cairo.h"
31
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);
36 }
37
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;
43
44   Universe *universe;
45   Polygon *grabbed_polygon;
46
47   if(argc < 2 || argc > 3) {
48     cerr << argv[0] << " <nb pairs to generate> [<seed>]" << endl;
49     exit(1);
50   }
51
52   int nb_pairs = atoi(argv[1]);
53
54   if(argc > 2) {
55     srand48(atoi(argv[1]));
56   }
57
58   universe = new Universe(10, world_width, world_height);
59
60   for(int n = 0; n < nb_pairs; n++) {
61     cout << "Example " << n << endl;
62
63     do {
64       universe->clear();
65
66       const int nb_attempts_max = 100;
67       int nb_attempts = 0;
68
69       for(int u = 0; u < 10; u++) {
70         Polygon *pol = 0;
71
72         nb_attempts = 0;
73
74         do {
75           scalar_t square_size = 80;
76
77           scalar_t x[] = {
78             - square_size * 0.5,
79             + square_size * 0.5,
80             + square_size * 0.5,
81             - square_size * 0.5,
82           };
83
84           scalar_t y[] = {
85             - square_size * 0.5,
86             - square_size * 0.5,
87             + square_size * 0.5,
88             + square_size * 0.5,
89           };
90
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;
96           green = red;
97           blue = red;
98           delete pol;
99           pol = new Polygon(0.5,
100                             red, green, blue,
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);
105           nb_attempts++;
106         } while(nb_attempts < nb_attempts_max && universe->collide(pol));
107
108         if(nb_attempts == nb_attempts_max) {
109           delete pol;
110           u = 0;
111           universe->clear();
112           nb_attempts = 0;
113         } else {
114           universe->add_polygon(pol);
115         }
116       }
117
118       grabbed_polygon = universe->pick_polygon(grab_start_x, grab_start_y);
119     } while(!grabbed_polygon);
120
121     const scalar_t scaling = 0.16;
122
123     {
124       char buffer[1024];
125       sprintf(buffer, "/tmp/universe_%03d_0.png", n);
126       FILE *file = fopen(buffer, "w");
127       generate_png(universe, scaling, file);
128     }
129
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);
132
133     scalar_t dt = 0.1;
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);
139     }
140
141     {
142       char buffer[1024];
143       sprintf(buffer, "/tmp/universe_%03d_1.png", n);
144       FILE *file = fopen(buffer, "w");
145       generate_png(universe, scaling, file);
146     }
147   }
148
149   delete universe;
150 }