All pastes #762749 Raw Edit

houlala

public cpp v1 · immutable
·published 2007-11-05 21:43 UTC
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;}