Page d'accueil Description du projet
/*********************************************
 *
 * Cedric Pradalier
 * DEA 2000/2001 
 * INRIA Rhones Alpes
 * http://cedric.pradalier.free.fr/index.html
 * mail : http://cedric.pradalier.free.fr/mail.html
 *
 * *******************************************/
#include "VisibilityPolygon.h"
#include "stdio.h"

Vector VisibilityPolygon::Blist::allBlist;

VisibilityPolygon::Blist::Blist(Blist * n,double bx,double by)
{
        next = n;
        balise = new Vector2(bx,by);
        if (n==NULL)
                length = 1;
        else
                length = n->length + 1;
        Blist::allBlist.addElement(this);
}

VisibilityPolygon::VisibilityPolygon(FILE* fp)
{
        int i,n;
        double x,y;
        fscanf(fp," Polygon = ");
        poly=new Polygon();
        poly->Read(fp);
        fscanf(fp," Visibles[ %d ] : ",&n);
        Blist *tmp = NULL;
        for (i=0;i<n;i++)
        {
                fscanf(fp," { %le , %le } ",&x,&y);
                tmp = new Blist(tmp,x,y);
        }
        visi = tmp;
        tristrip = NULL;
}


void VisibilityPolygon::split(Balise* bal,Vector * destination)
{
        Polygon * P;
        Blist * B;
        Vector * tmp;
        int i;
        P = poly->Intersection(bal->getVisibility());
        if (P->isEmpty())
        {
                delete P;
        } else {
                B = new Blist(visi,bal->getX(),bal->getY());
                destination->addElement(new VisibilityPolygon(P,B));
        }
        P = poly->Minus(bal->getVisibility());
        if (!P->isEmpty())
        {
                tmp = new Vector();
                P->getConnexList(tmp);
                for(i=0;i<tmp->size();i++)
                {
                        Polygon* cnx = (Polygon*)(tmp->elementAt(i));
                        destination->addElement(
                                        new VisibilityPolygon(cnx,visi));
                }
                delete tmp;
        }
        delete P;
}


void VisibilityPolygon::getVisibility(Vector * destination)
{
        Blist * tmp = visi;
        while (tmp != NULL)
        {
                destination->addElement(tmp->balise);
                tmp=tmp->next;
        }
}

void VisibilityPolygon::Print()
{
        printf("Polygon = \n");
        poly->Print();
        printf("Visibles[%d] : ",getMark());
        Blist * tmp = visi;
        while (tmp != NULL)
        {
                tmp->balise->Print(false);
                printf(" ");
                tmp=tmp->next;
        }
        printf("\n");
}

        

void VisibilityPolygon::Print(FILE * fp)
{
        FILE *tmp = stdout;
        stdout = fp;
        Print();
        stdout = tmp;
}

        
void VisibilityPolygon::buildTriStrips()
{
        if (tristrip==NULL)
                tristrip = new TriangleStrip(poly);
}

bool VisibilityPolygon::contains(double x,double y)
{
        if (tristrip!=NULL)
                return tristrip->contains(x,y);
        else
                return false;
}