package ds.moteur.voiture;
import java.util.ArrayList;
import java.util.List;
import ds.moteur.geometrie.Angle3D;
import ds.moteur.geometrie.Point;
import ds.moteur.geometrie.Position;
import ds.moteur.route.cc.CourbeConduite;
import ds.moteur.route.cc.PointEntree;
import ds.moteur.route.cc.PointSortie;
public class Voiture {
protected String nom;
protected Position position;
protected CourbeConduite courbeSuivante;
protected Point positionAvant;
protected Angle3D angle;
protected double cap;
protected double longueur;
protected double largeur;
protected Mecanique mecanique;
protected List<Point> carrosserie;
public Voiture(String nom, double longueur, double largeur){
this.nom = nom;
this.longueur = longueur;
this.largeur = largeur;
this.positionAvant = new Point();
this.angle = new Angle3D();
this.mecanique = new Mecanique();
this.carrosserie = new ArrayList<Point>();
}
public String getNom() {
return nom;
}
public void init(PointEntree entree){
this.position = new Position(entree);
this.position.getCourbeCourante().getAbonnes().add(this);
this.choisirUneCourbe(position.getCourbeCourante().getSortie());
position.recupererPosition(positionAvant, angle);
this.carrosserie.add(new Point(-longueur/2, largeur/2));
this.carrosserie.add(new Point(longueur/2, largeur/2));
this.carrosserie.add(new Point(longueur/2, -largeur/2));
this.carrosserie.add(new Point(-longueur/2, -largeur/2));
for (Point p : carrosserie){
p.transformer(positionAvant, angle.theta);
}
}
public void incrementer(long ms){
this.position.addAbscisse((mecanique.vitesse*ms)/1000);
boolean surCourbe = position.recupererPosition(positionAvant, angle);
if (!surCourbe){
position.retrancherAbscisseCourbe();
position.getCourbeCourante().getAbonnes().remove(this);
position.setCourbeCourante(courbeSuivante);
position.recupererPosition(positionAvant, angle);
choisirUneCourbe(position.getCourbeCourante().getSortie());
}
this.replacerCarrosserie();
}
protected void replacerCarrosserie(){
this.carrosserie.get(0).setXYZ(-longueur/2, largeur/2, 0);
this.carrosserie.get(1).setXYZ(longueur/2, largeur/2, 0);
this.carrosserie.get(2).setXYZ(longueur/2, -largeur/2, 0);
this.carrosserie.get(3).setXYZ(-longueur/2, -largeur/2, 0);
for (Point p : carrosserie){
p.transformer(positionAvant, angle.theta);
}
}
private void choisirUneCourbe(PointSortie ps){
PointEntree pe = ps.getLien();
if (pe != null){
List<CourbeConduite> courbesPossibles = pe.getCourbes();
double rand = Math.random();
if ((rand<0.5)||(courbesPossibles.size()<2)){
courbeSuivante = courbesPossibles.get(0);
} else {
courbeSuivante = courbesPossibles.get(1);
}
}
}
public Point getPositionAvant() {
return positionAvant;
}
public Angle3D getAngle() {
return angle;
}
public List<Point> getCarrosserie(){
return this.carrosserie;
}
public double getDistance(Voiture vCible){
double distance = 1000;
if (this.position.getCourbeCourante() == vCible.position.getCourbeCourante()){
if (this.position.getAbscisseCourbe()<vCible.position.getAbscisseCourbe()){
distance = vCible.position.getAbscisseCourbe() - this.position.getAbscisseCourbe();
}
} else if (this.courbeSuivante == vCible.position.getCourbeCourante()){
distance = this.position.getCourbeCourante().getLongueur() - this.position.getAbscisseCourbe() + vCible.position.getAbscisseCourbe();
}
//On soustrait les longueurs centre - pare-chocs.
distance -= (this.longueur + vCible.longueur)/2;
return distance;
}
public double getLongueur(){
return longueur;
}
public Mecanique getMecanique(){
return mecanique;
}
}