package ds.moteur.route.personnalise;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import ds.moteur.geometrie.Angle3D;
import ds.moteur.geometrie.Point;
import ds.moteur.route.Route;
import ds.moteur.route.cc.CourbeConduite;
import ds.moteur.route.cc.PointEntree;
import ds.moteur.route.cc.PointSortie;
@SuppressWarnings("serial")
public class RouteCourbe extends Route implements Serializable{
private final static double FINESSE = Math.PI/12;
public RouteCourbe(Point position, Angle3D angle, String nom, double rayon, double ecartement, double ouverture) {
super(position, angle, nom);
PointSortie p1 = new PointSortie(0, rayon + ecartement/2);
PointEntree p2 = new PointEntree((rayon + ecartement/2)*Math.sin(ouverture), (rayon + ecartement/2)*Math.cos(ouverture));
PointEntree p3 = new PointEntree(0, rayon -ecartement/2);
PointSortie p4 = new PointSortie((rayon - ecartement/2)*Math.sin(ouverture), (rayon - ecartement/2)*Math.cos(ouverture));
CourbeConduite cc1 = new CourbeConduite(this, p2, p1);
CourbeConduite cc2 = new CourbeConduite(this, p3, p4);
this.addCourbeConduite(cc1);
this.addCourbeConduite(cc2);
int iterations = (int)(ouverture/FINESSE);
List<Point> sommets = new ArrayList<Point>();
sommets.add(Point.createPolarNorth(rayon + ecartement, ouverture));
for (int i=iterations-1; i>0; i--){
Point pi1 = Point.createPolarNorth(rayon + ecartement/2, i*ouverture/iterations);
cc1.addPointIntermediaire(pi1);
Point pf = Point.createPolarNorth(rayon + ecartement, i*ouverture/iterations);
sommets.add(pf);
}
cc1.addArc(new Point(), rayon + ecartement/2, ouverture, -ouverture, iterations-1);
sommets.add(Point.createPolarNorth(rayon + ecartement, 0));
sommets.add(Point.createPolarNorth(rayon - ecartement, 0));
for (int i=1; i<iterations; i++){
Point pi2 = Point.createPolarNorth(rayon - ecartement/2, i*ouverture/iterations);
cc2.addPointIntermediaire(pi2);
Point pf = Point.createPolarNorth(rayon - ecartement, i*ouverture/iterations);
sommets.add(pf);
}
cc2.addArc(new Point(), rayon - ecartement/2, 0, ouverture, iterations-1);
sommets.add(Point.createPolarNorth(rayon - ecartement, ouverture));
this.addEntree(p2);
this.addEntree(p3);
this.addSortie(p1);
this.addSortie(p4);
this.creerFrontiere(sommets);
}
/*private void creerFrontiere(double longueur, double ecartement, double ouverture){
Point3D p1 = new Point3D(-longueur/2, ecartement);
Point3D p2 = new Point3D(longueur/2, ecartement);
Point3D p3 = new Point3D(longueur/2, -ecartement);
Point3D p4 = new Point3D(-longueur/2, -ecartement);
this.addPointFrontiere(p1);
this.addPointFrontiere(p2);
this.addPointFrontiere(p3);
this.addPointFrontiere(p4);
}*/
}