package ds.moteur.route.cc.elements;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import ds.io.Sauvegardable;
import ds.moteur.geometrie.Angle3D;
import ds.moteur.geometrie.BasicGeo;
import ds.moteur.geometrie.Point;
import ds.moteur.geometrie.Vecteur;
/**Cette classe repr�sente un �l�ment de type arc.
*
* @author Yannick BISIAUX
*
*/
public class Arc extends LigneElementaire implements Sauvegardable{
protected Point centre;
protected double rayon;
/**Cap depuis le nord*/
protected double angleOrigine;
/**Positif vers l'est*/
protected double ouverture;
public Arc(){
super(null, null);
}
public Arc(Point p1, Point p2, Point centre, double rayon, double angleOrigine, double ouverture) {
super(p1, p2);
this.centre = centre;
this.rayon = rayon;
this.angleOrigine = angleOrigine;
this.ouverture = ouverture;
}
public void calculerLongueur() {
this.longueur = Math.abs(rayon*ouverture);
}
public void recupererAngle(Angle3D angle, double ratio) {
double cap = - (angleOrigine + ratio*ouverture);
if (ouverture<0){
cap += Math.PI;
}
angle.theta = cap;
}
public void recupererPoint(Point point, double ratio) {
double theta = angleOrigine + ratio*ouverture;
point.x = centre.x + rayon*Math.sin(theta);
point.y = centre.y + rayon*Math.cos(theta);
}
/**Permet d'effectuer une transformation affine sur cet �l�ment.
*
* @param translation les coordonn�es de la translation
* @param rotation l'angle de rotation en radians
*/
public void transformer(Point translation, double rotation){
centre.transformer(translation, rotation);
angleOrigine -= rotation;
}
public double projeter(Point point){
Vecteur vecteur = new Vecteur(centre, point);
double angle = BasicGeo.liPi(Math.PI/2 - vecteur.getAngle() - angleOrigine);
double alpha = angle/ouverture;
return alpha;
}
public double projeterAbsCurv(Point point) {
//La cr�ation du vecteur peut consommer du temps
Vecteur vecteur = new Vecteur(centre, point);
double angle = BasicGeo.liPi(Math.PI/2 - vecteur.getAngle() - angleOrigine);
double absCurv;
if(ouverture>0){
absCurv = angle*rayon;
} else {
absCurv = -angle*rayon;
}
return absCurv;
}
public double projeterDistance(Point point) {
double distance = Math.abs(point.getDistance(centre) - rayon);
return distance;
}
public Point getCentre(){ return this.centre; }
public double getRayon(){ return this.rayon; }
public double getAngleOrigine(){ return this.angleOrigine; }
public double getOuverture(){ return this.ouverture; }
public void load(DataInputStream dis) throws IOException {
super.load(dis);
this.centre = new Point();
this.centre.load(dis);
this.rayon = dis.readDouble();
this.angleOrigine = dis.readDouble();
this.ouverture = dis.readDouble();
}
public void save(DataOutputStream dos) throws IOException {
dos.writeShort(TypeElement.ARC.ordinal());
super.save(dos);
this.centre.save(dos);
dos.writeDouble(this.rayon);
dos.writeDouble(this.angleOrigine);
dos.writeDouble(this.ouverture);
}
}