Minor update.
[pysvrt] / vision_problem_21.cc
1 /*
2  *  svrt is the ``Synthetic Visual Reasoning Test'', an image
3  *  generator for evaluating classification performance of machine
4  *  learning systems, humans and primates.
5  *
6  *  Copyright (c) 2009 Idiap Research Institute, http://www.idiap.ch/
7  *  Written by Francois Fleuret <francois.fleuret@idiap.ch>
8  *
9  *  This file is part of svrt.
10  *
11  *  svrt is free software: you can redistribute it and/or modify it
12  *  under the terms of the GNU General Public License version 3 as
13  *  published by the Free Software Foundation.
14  *
15  *  svrt is distributed in the hope that it will be useful, but
16  *  WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  *  General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with svrt.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  */
24
25 #include "vision_problem_21.h"
26 #include "shape.h"
27
28 VisionProblem_21::VisionProblem_21() { }
29
30 void VisionProblem_21::generate(int label, Vignette *vignette) {
31   int nb_shapes = 2;
32   int xs[nb_shapes], ys[nb_shapes];
33   scalar_t scales[nb_shapes], angles[nb_shapes];
34   Shape shapes[nb_shapes];
35
36   int error;
37   do {
38
39     scalar_t max_scale = -1;
40
41     for(int n = 0; n < nb_shapes; n++) {
42       xs[n] = int(random_uniform_0_1() * Vignette::width);
43       ys[n] = int(random_uniform_0_1() * Vignette::height);
44
45       scales[n] = 1.0 + 3.0 * random_uniform_0_1();
46
47       if(n == 0 || scales[n] > max_scale) max_scale = scales[n];
48
49       angles[n] = random_uniform_0_1() * 2 * M_PI;
50     }
51
52     for(int n = 0; n < nb_shapes; n++) {
53       if(n == 0 || label == 0) {
54         shapes[n].randomize(max_scale * part_size / 2, max_scale * hole_size/2);
55       } else {
56         shapes[n].copy(&shapes[0]);
57       }
58     }
59
60     for(int n = 0; n < nb_shapes; n++) {
61       shapes[n].scale(scales[n] / max_scale);
62       shapes[n].rotate(angles[n]);
63     }
64
65     vignette->clear();
66
67     error = 0;
68     for(int n = 0; n < nb_shapes; n++) {
69       error |= shapes[n].overwrites(vignette, xs[n], ys[n]);
70       if(!error) {
71         shapes[n].draw(n, vignette, xs[n], ys[n]);
72       }
73     }
74   } while(error);
75 }