package ds.moteur.route;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import ds.io.Sauvegardable;
import ds.moteur.geometrie.Angle3D;
import ds.moteur.geometrie.Point;
import ds.moteur.geometrie.Polygone;
import ds.moteur.route.cc.CourbeConduite;
import ds.moteur.route.cc.PointEntree;
import ds.moteur.route.cc.PointSortie;
/**Cette classe repr�sente une section de route.
*
* @author Yannick BISIAUX
*
*/
public class Section implements Sauvegardable{
private boolean absolu;
private Point positionAbsolue;
private Angle3D angle;
private List<CourbeConduite> courbesConduites;
private List<PointEntree> entrees;
private List<PointSortie> sorties;
private List<Section> connexions;
private Polygone frontiere;
public Section(){
this(new Point(), new Angle3D());
}
public Section(Point position, Angle3D angle){
this.positionAbsolue = position;
this.angle = angle;
this.courbesConduites = new ArrayList<CourbeConduite>();
this.entrees = new ArrayList<PointEntree>();
this.sorties = new ArrayList<PointSortie>();
this.connexions = new ArrayList<Section>();
//this.frontiere = new ArrayList<Point>();
absolu = false;
}
public Point getPositionAbsolue() { return positionAbsolue; }
public Angle3D getAngle(){ return this.angle; }
protected void addCourbeConduite(CourbeConduite courbe){ this.courbesConduites.add(courbe); }
public List<CourbeConduite> getCourbesConduites(){ return this.courbesConduites; }
protected void addEntree(PointEntree entree){ this.entrees.add(entree); }
public List<PointEntree> getEntrees() { return entrees; }
protected void addSortie(PointSortie sortie){ this.sorties.add(sortie); }
public List<PointSortie> getSorties() { return sorties; }
public void addConnexion(Section connexion){ this.connexions.add(connexion); }
public List<Section> getConnexions() { return connexions; }
protected void creerFrontiere(List<Point> sommets){
this.frontiere = Polygone.createPolygone(sommets);
}
//protected void addPointFrontiere(Point point){ this.frontiere.add(point); }
public Polygone getFrontiere() { return frontiere; }
/**Translate les �l�ments dans leur position absolue si n�cessaire.
*
*/
public void rendreAbsolu(){
if (!absolu){
for (PointEntree entree : entrees){
entree.transformer(positionAbsolue, angle.theta);
}
for (PointSortie sortie : sorties){
sortie.transformer(positionAbsolue, angle.theta);
}
for (Point point : frontiere.getSommets()){
point.transformer(positionAbsolue, angle.theta);
}
for (CourbeConduite cc : courbesConduites){
cc.rendreAbsoluPI();
}
}
absolu = true;
}
public boolean isInside(Point p){
return false;
}
public void load(DataInputStream dis) throws IOException {
//Reconstitution de la position et de l'orientation
positionAbsolue.load(dis);
angle.load(dis);
//Reconstitution des points d'entr�e
int nEntree = dis.readShort();
for(int i=0; i<nEntree; i++){
PointEntree entree = new PointEntree();
entree.load(dis);
this.addEntree(entree);
}
//Reconstitution des points de sorties
int nSortie = dis.readShort();
for(int i=0; i<nSortie; i++){
PointSortie sortie = new PointSortie();
sortie.load(dis);
this.addSortie(sortie);
}
//Reconstitution des CC
int nCC = dis.readShort();
for(int i=0; i<nCC; i++){
int indexEntree = dis.readShort();
int indexSortie = dis.readShort();
CourbeConduite cc = new CourbeConduite(this, entrees.get(indexEntree), sorties.get(indexSortie));
cc.load(dis);
this.addCourbeConduite(cc);
}
//Reconstitution de la frontiere
//TODO passer le code dans Polygone
int nFrontiere = dis.readShort();
List<Point> sommets = new ArrayList<Point>();
for(int i=0; i<nFrontiere; i++){
Point point = new Point();
point.load(dis);
sommets.add(point);
}
frontiere = Polygone.createPolygone(sommets);
}
public void save(DataOutputStream dos) throws IOException {
//Sauvegarde de la position et de l'orientation
positionAbsolue.save(dos);
angle.save(dos);
//Sauvegarde des points d'entr�e
dos.writeShort(entrees.size());
for (PointEntree point : entrees){
point.save(dos);
}
//Sauvegarde des points de sorties
dos.writeShort(sorties.size());
for (PointSortie point : sorties){
point.save(dos);
}
//Sauvegarde des CC
dos.writeShort(courbesConduites.size());
for (CourbeConduite cc : courbesConduites){
int indexEntree = entrees.indexOf(cc.getEntree());
dos.writeShort(indexEntree);
int indexSortie = sorties.indexOf(cc.getSortie());
dos.writeShort(indexSortie);
cc.save(dos);
}
//Sauvegarde de la frontiere
//TODO passer le code dans Polygone
dos.writeShort(frontiere.getSommets().size());
for (Point point : frontiere.getSommets()){
point.save(dos);
}
}
}