Page d'accueil Description du projet
#ifndef VISIBILITYPOLYGON_H
#define VISIBILITYPOLYGON_H
/*********************************************
 *
 * Cedric Pradalier
 * DEA 2000/2001 
 * INRIA Rhones Alpes
 * http://cedric.pradalier.free.fr/index.html
 * mail : http://cedric.pradalier.free.fr/mail.html
 *
 * *******************************************/

#include "Vector.h"
#include "Polygon.h"
#include "TriangleStrip.h"
#include <vector2.h>
#include "Object.h"
#include "Balise.h"


// Classe implémentant des cellules de visibilité
// Utilisé pour partitionné l'espace de travail selon les balises
// visibles. 
class VisibilityPolygon : public Object {
    private :
        // Structure de liste pour stocker les balises visibles dans un 
        // polygone. La liste des balises visibles est construites pendant le 
        // partionnement de l'espace de travail. Pour simplifier la gestion de
        // la mémoire, tous les Blist sont insérés dans un tableau statique,
        // qui peut etre vidé de facon statique.
        struct Blist : public Object {
                Blist * next;
                Vector2 * balise;
                // longueur de la liste, this compris
                unsigned int length;

                Blist(Blist * n,double bx,double by);
                virtual ~Blist() {delete balise;}


                static Vector allBlist;
                static void deleteAll() {allBlist.deleteAll();}
        };
            
        // Polygone décrivant la cellule
        Polygon * poly;
        // Triangulation du polygone. N'est construit que sur demande explicite
        TriangleStrip * tristrip;
        // Liste des balises visibles
        Blist * visi;
        
    public :
        VisibilityPolygon(Polygon * P) 
        {
                poly=P;visi=NULL;tristrip=NULL;
        }
        VisibilityPolygon(Polygon * P,Blist * b) 
        {
                poly=P;visi=b;tristrip=NULL;
        }
        // Lecture dans fp
        VisibilityPolygon(FILE * fp);
        virtual ~VisibilityPolygon() {delete poly;delete tristrip;}
        virtual void Print();
        // Sauvegarde dans fp
        void Print(FILE * fp);

        // nettoyage de toutes les balises
        static void deleteVisibilityInformations() {Blist::deleteAll();}
        
        // partition de this selon les parties où bal est visible (ou non). Les
        // différents polygones (tous connexes) sont inseres dans destination
        void split(Balise* bal, Vector* destination); 
        
        // Rassemble toutes les balises visibles dans destination
        void getVisibility(Vector * destination);

        // Renvoie le nb de balises visibles
        unsigned int  getMark() {return (visi==NULL)?0:(visi->length);}
        
        Polygon * getPolygon() {return poly;}

        // Triangulation 
        void buildTriStrips();
        
        // Teste si (x,y) appartient au polygone. Utilise la triangulation. Si
        // celle ci n'a pas ete faite, renvoie false
        bool contains(double x,double y);
        TriangleStrip* getTriStrip() {return tristrip;}
};


#endif // VISIBILITYPOLYGON_H