/*********************************************
*
* 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;
}