BOOKS i'm reading |
/* * Module ID: chains.h * Titre : Declaration des classe de chaines. * Utilite : Structure de donnee pour la location de point * comme decrit dans 'Computational Geometry' de * Franco P. Preparata & Michael Ian Shamos (P. 48) * * Note : Les chaines monotones utilisees sur un diagramme de Voronoi * permettent de trouver le plus proche voisin d'un point x en * O(nlogn) comparativement a O(n^2) avec une methode brutale. * * Auteur : Olivier Langlois (olivier@olivierlanglois.net) * Date : 24 Mars 1998 * * Revision : * * 001 27-Mar-1998 - Olivier Langlois * Les fstreams ne fonctionnent pas avec le compilateur GNU 2.7.2.1 * lorsque compile avec l'option -frtti. */ #ifndef _CHAINS_H_ #define _CHAINS_H_ #include "collect/bintree.h" #include "collect/rbtree.h" #include "collect/pq.h" #include "geo/dcel.h" class ChainMesh : public Collectable { DECLARE_COLLECTABLE(ChainMesh) public: ChainMesh() : edgeIdx(ULONG_MAX), edgesPtr(NULL) {} ChainMesh( CollectableULong *idx, DCEL *ptr ) : edgeIdx(*idx), edgesPtr(ptr) {} ~ChainMesh() {} CollectableULong *getEdgeIdx() { return &edgeIdx; } /****************************************************************************** * * Nom : isInMesh * * Utilite : Verifie si le point est a la meme hauteur (ycoord) que le * maillon. * * Parametres: * p * * Valeur de retour: (int) -1 le point est plus bas * 0 le point est entre les 2 vertices * 1 le point est plus haut * ****************************************************************************/ int isInMesh( const point &p ); #ifdef __GNUG__ virtual void saveGuts( FILE * ); virtual void restoreGuts( FILE * ); #else virtual void saveGuts( ofstream & ); virtual void restoreGuts( ifstream & ); #endif int operator==(const ChainMesh &b) const; int operator<(const ChainMesh &b) const; int operator>(const ChainMesh &b) const; int operator!=(const ChainMesh &b) const { return !operator==(b); } int operator<=(const ChainMesh &b) const { return operator<(b)||operator==(b); } int operator>=(const ChainMesh &b) const { return operator>(b)||operator==(b); } DCEL *edgesPtr; private: CollectableULong edgeIdx; }; class Chain : public RedBlackTree<ChainMesh> { DECLARE_COLLECTABLE(Chain) public: Chain() : RedBlackTree<ChainMesh>(&Chain::saveChainMesh,&Chain::restoreChainMesh), chainNum(ULONG_MAX) {} Chain( unsigned long chainID ) : RedBlackTree<ChainMesh>(&Chain::saveChainMesh,&Chain::restoreChainMesh), chainNum(chainID) {} ~Chain() {} /****************************************************************************** * * Nom : findMesh * * Utilite : Trouve le maillon qui est a la meme hauteur que p. * * Parametres: * p * * Valeur de retour: (CollectableULong *) Index de l'arete du maillon * ****************************************************************************/ CollectableULong *findMesh( const point &p ); unsigned long getChainNum() { return chainNum; } #ifdef __GNUG__ virtual void saveGuts( FILE * ); virtual void restoreGuts( FILE * ); #else virtual void saveGuts( ofstream & ); virtual void restoreGuts( ifstream & ); #endif int operator==(const Chain &b) const { return chainNum == b.chainNum; } int operator!=(const Chain &b) const { return !operator==(b); } int operator<(const Chain &b) const { return chainNum < b.chainNum; } int operator>(const Chain &b) const { return chainNum > b.chainNum; } int operator<=(const Chain &b) const { return operator<(b)||operator==(b); } int operator>=(const Chain &b) const { return operator>(b)||operator==(b); } static DCEL *edgesPtr; private: static void saveChainMesh( const ChainMesh &item, void *param ); static void restoreChainMesh( const ChainMesh &item, void *param ); unsigned long chainNum; }; class ChainsSet : public BinaryTree<Chain> { DECLARE_COLLECTABLE(ChainsSet) public: ChainsSet(); ChainsSet( DCEL *list ); ~ChainsSet() { delete edgesPtr; } /****************************************************************************** * * Nom : insert * * Utilite : Insere une maille. * * Parametres: * m (ChainMesh *) maille a inseree. * min,max (unsigned long) interval de chaines valides. * * Valeur de retour: Aucune * ****************************************************************************/ void insert( ChainMesh *, unsigned long, unsigned long ); /****************************************************************************** * * Nom : location * * Utilite : Trouve la location de p. * * Parametres: * p * * Valeur de retour: (face *) Face dans lequel le point se trouve. * Si le graph est un diagramme de Voronoi alors * le point le plus proche est trouve par la meme * occasion. * ****************************************************************************/ face *location( const point &p ); #ifdef __GNUG__ virtual void saveGuts( FILE * ); virtual void restoreGuts( FILE * ); #else virtual void saveGuts( ofstream & ); virtual void restoreGuts( ifstream & ); #endif private: /* * Nom : init * Utilite : * procedure WEIGHT-BALANCING IN REGULAR PSLG (Planar Straight-Line Graph) * 'Computational Geometry' de * Franco P. Preparata & Michael Ian Shamos (P. 51) */ void init(); static void saveChain( const Chain &item, void *param ); static void restoreChain( const Chain &item, void *param ); DCEL *edgesPtr; }; /* * N'ayant pu verifier la validite de l'etat des pointeurs P1 et P2 des * instances de la classe edge, une methode alternative a du etre employe pour * traverser les aretes connectees a un vertex. La classe edgeInfo est utilisee * dans cette methode alternative utilise dans ChainsSet::init(). */ class edgeInfo { public: edgeInfo() : e(NULL) {} ~edgeInfo() {} int operator==(const edgeInfo &b) const { return Key == b.Key; } int operator!=(const edgeInfo &b) const { return !operator==(b); } // La priorite est plus petite lorsque la clef est plus grande (angle). int operator<(const edgeInfo &b) const { return Key > b.Key; } // La priorite est plus grande lorsque la clef est plus petite (angle). int operator>(const edgeInfo &b) const { return Key < b.Key; } int operator<=(const edgeInfo &b) const { return operator<(b)||operator==(b); } int operator>=(const edgeInfo &b) const { return operator>(b)||operator==(b); } edge *e; double Key; }; #endif /* _CHAINS_H_ */ |