BOOKS i'm reading
 |
/*
* Module ID: clqtree.h
* Titre : Declaration de la classe ClusteringQuadTree.
* Utilite : Structure de donnees inventee par moi-meme pour
* resoudre efficacement les problemes de clustering.
* Le raisonnement qui a guide le design de cette structure,
* c'est qu'il est plus efficace de manipuler une collection
* d'objets (dans ce cas ci, ce sont des points) que tous les
* objets individuellement.
* Les performances sont encore a analyser.
*
* Auteur : Olivier Langlois (olivier@olivierlanglois.net)
* Date : 1 Mars 1998
*
* Revision :
*
* 001 09-Sep-1998 - Olivier Langlois
* Modifications pour s'adapter a la nouvelle classe oliCollection.
*/
#ifndef _CLQTREE_H_
#define _CLQTREE_H_
#include "geo/polygon.h"
#include "collect/idlist.h"
#include "uref.h"
#include "geo/cqtreex.h"
class CQTNode : public polygon, public Reference
{
friend class ClusteringQuadTree;
private:
// La raison qui justifie l'usage de 4 pointeurs distincts plutot
// qu'un array, c'est qu'avec un array, il est impossible de faire
// references a des objets d'une classe derivee.
CQTNode *node1;
CQTNode *node2;
CQTNode *node3;
CQTNode *node4;
void calculateMoy();
protected:
point *moy;
// Constructeur qui peut etre utilise par les classes derivees
CQTNode( const IDList &pl )
: polygon(pl), node1(NULL), node2(NULL), node3(NULL), node4(NULL), moy(NULL)
{ addReference(); }
public:
CQTNode( IDList &, size_t );
virtual ~CQTNode();
virtual Boolean insertPoint( point * );
virtual void split( const line &, CQTNode **, CQTNode ** );
};
class CQTBucketNode : public CQTNode
{
private:
IDList pointList;
public:
CQTBucketNode( const IDList &pl ) : CQTNode(pl) {}
virtual Boolean insertPoint( point * );
virtual void split( const line &, CQTNode **, CQTNode ** );
};
class ClusteringQuadTree : public oliCollection
{
DECLARE_COLLECTABLE(ClusteringQuadTree)
private:
CQTNode *root;
size_t numEntries;
size_t levels;
public:
ClusteringQuadTree() : root(NULL), numEntries(0), levels(1) {}
/******************************************************************************
*
* Nom : ClusteringQuadTree
*
* Utilite : Constructeur.
*
* Parametres:
* pl (IDList &) Liste de points representant les vertices de la region
* geree par l'arbre
*
* numLvls (size_t) Nombre de niveaux desires dans l'arbre.
*
* Valeur de retour: Aucune
*
****************************************************************************/
ClusteringQuadTree( IDList &pl, size_t numLvls = 4 );
~ClusteringQuadTree();
/******************************************************************************
*
* Nom : splitTree
*
* Utilite : Construit 2 sous-QuadTree, l'un contenant tous les noeuds
* a gauche de la ligne, l'autre tous les noeud a droite.
*
* Parametres:
* l (line &) ligne separatrice
* lTree (ClusteringQuadTree **) Arbre gauche
* rTree (ClusteringQuadTree **) Arbre droit
*
* Note : L'usager est responsable de liberer les ressources utilisees
* par lTree & rTree.
*
* Valeur de retour: Aucune
*
****************************************************************************/
void splitTree( const line &, ClusteringQuadTree **, ClusteringQuadTree ** );
/******************************************************************************
*
* Nom : insertPoint
*
* Utilite : Insere un point dans l'arbre
*
* Parametres:
* p (point *) Le point a insere
*
* Note : L'usage de cette fonction apres l'appel de splitTree peut
* affecter de facon indesirable les arbres retournes par
* splitTree.
*
* Valeur de retour: Aucune
*
****************************************************************************/
void insertPoint( point * );
virtual void clear( void );
virtual size_t entries( void ) const { return numEntries; }
virtual Boolean isEmpty( void ) const
{ return (!numEntries)?BOOL_TRUE:BOOL_FALSE; }
// Fonctions getters
point *getMoy( void ) { return root->moy; }
};
#endif /* _CLQTREE_H_ */
|