#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