rendered paste body#include <split.h>#include <iostream>#include <fstream>#include <sstream>#include <string>#include <math.h>#include <GL/gl.h>using namespace std;Split :: Split() : root(NULL), image(NULL), lines(0), rows(0){}Split :: Split(const char * _filename) : root(NULL), image(NULL), lines(0), rows(0){ load(_filename);}void Split :: rec_split(QuadTree * _node, int _level){ double criteria = 2500; double mean, variance; int n; if(_level < 0) return; mean = 0; n = 0; for(int j(_node->bbox[0][1]); j < _node->bbox[1][1]; j++) { for(int i(_node->bbox[0][0]); i < _node->bbox[1][0]; i++) { mean += (int)image[j * rows +i]; n++; } } mean /= (double)n; variance = 0; for(int j(_node->bbox[0][1]); j < _node->bbox[1][1]; j++) for(int i(_node->bbox[0][0]); i < _node->bbox[1][0]; i++) variance += pow((int)image[j * rows +i] - mean, 2); if(variance > criteria && n > 1) { QuadTree * sons[4]; _node->nw = sons[0] = new QuadTree(); _node->ne = sons[1] = new QuadTree(); _node->sw = sons[2] = new QuadTree(); _node->se = sons[3] = new QuadTree(); for(int i(0); i < 4; i++) { if(i != 0) sons[i]->prev = sons[i - 1]; if(i != 3) sons[i]->next = sons[i + 1]; sons[i]->id = _node->id * 10 + (i + 1); sons[i]->root = _node; } sons[0]->bbox[0][0] = _node->bbox[0][0]; sons[0]->bbox[0][1] = _node->bbox[0][1] + (_node->bbox[1][1] - _node->bbox[0][1]) / 2; sons[0]->bbox[1][0] = _node->bbox[0][0] + (_node->bbox[1][0] - _node->bbox[0][0]) / 2; sons[0]->bbox[1][1] = _node->bbox[1][1]; sons[1]->bbox[0][0] = sons[0]->bbox[1][0]; sons[1]->bbox[0][1] = sons[0]->bbox[0][1]; sons[1]->bbox[1][0] = _node->bbox[1][0]; sons[1]->bbox[1][1] = _node->bbox[1][1]; sons[2]->bbox[0][0] = _node->bbox[0][0]; sons[2]->bbox[0][1] = _node->bbox[0][1]; sons[2]->bbox[1][0] = sons[0]->bbox[1][0]; sons[2]->bbox[1][1] = sons[0]->bbox[0][1]; sons[3]->bbox[0][0] = sons[1]->bbox[0][0]; sons[3]->bbox[0][1] = _node->bbox[0][1]; sons[3]->bbox[1][0] = _node->bbox[1][0]; sons[3]->bbox[1][1] = sons[1]->bbox[0][1]; rec_split(sons[0], _level - 1); rec_split(sons[1], _level - 1); rec_split(sons[2], _level - 1); rec_split(sons[3], _level - 1); } //cout << endl;}void Split :: rec_display(QuadTree * _node) const{ if(_node == NULL) return; glBegin(GL_LINE_LOOP); glVertex2i(_node->bbox[0][0], _node->bbox[0][1]); glVertex2i(_node->bbox[1][0], _node->bbox[0][1]); glVertex2i(_node->bbox[1][0], _node->bbox[1][1]); glVertex2i(_node->bbox[0][0], _node->bbox[1][1]); glEnd(); rec_display(_node->nw); rec_display(_node->ne); rec_display(_node->sw); rec_display(_node->se);}bool Split :: load(const char * _filename){ ifstream file(_filename, ios::binary); string magic, line; int val; char c; if(!file) { cerr << "[Split :: load] Erreur. Le fichier " << _filename << " n'existe pas. Abandon du chargement." << endl; return false; } file >> magic; if(magic != "P5") { cerr << "[Split :: load] Erreur. Le fichier " << _filename << " n'est pas au format PGM (format : " << magic << "). Abandon du chargement." << endl; return false; } file >> std::ws; while(file.peek() == '#') getline(file, line); file >> rows; file >> lines; file >> val; if(lines * rows <= 0) { cerr << "[Split :: load] Erreur. Les dimensions de " << _filename << " sont incorrectes (x : " << lines << ", y : " << rows << "). Abandon du chargement." << endl; return false; } image = new unsigned char[lines * rows]; for(int j(lines - 1); j >= 0; j--) for(int i(0); i < rows; i++) { if(file.eof()) { cerr << "[Split :: load] Erreur. Les donnees de " << _filename << " sont incompletes (" << (lines * rows - i * j) << " valeurs manquantes). Abandon du chargement." << endl; return false; } c = file.get(); image[j * rows + i] = (unsigned char)c; } return true;}void Split :: display() const{ glRasterPos2i(0, 0); glDrawPixels(rows, lines, GL_LUMINANCE, GL_UNSIGNED_BYTE, image); glColor3f(0.9, 0, 0); rec_display(root);}void Split :: split(int _level){ root = new QuadTree(); root->id = 0; root->bbox[0][0] = 0; root->bbox[0][1] = 0; root->bbox[1][0] = rows; root->bbox[1][1] = lines; rec_split(root, _level);}int Split :: getWidth() const{ return rows;}int Split :: getHeight() const{ return lines;}