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 segment.
*
* @author Yannick BISIAUX
*
*/
public class Segment extends LigneElementaire implements Sauvegardable{
public Segment(){
super(null, null);
}
public Segment(Point p1, Point p2) {
super(p1, p2);
}
public void calculerLongueur() {
this.longueur = p1.getDistance(p2);
}
public void recupererAngle(Angle3D angle, double ratio) {
double cap;
if (p1.x != p2.x){
//Cas g�n�ral
cap = Math.atan((p2.y-p1.y)/(p2.x-p1.x));
if (p1.x>p2.x){
//On fait un demi-tour sur le cercle
cap = cap + Math.PI;
}
} else {
//Cas ou la tangente vaut l'infini
if (p1.y>p2.y){
cap = -Math.PI/2;
} else {
cap = Math.PI/2;
}
}
angle.theta = cap;
}
public void recupererPoint(Point point, double ratio) {
point.x = p1.x + ratio*(p2.x - p1.x);
point.y = p1.y + ratio*(p2.y - p1.y);
point.z = p1.z + ratio*(p2.z - p1.z);
}
public double projeter(Point point){
double X = p2.x - p1.x;
double Y = p2.y - p1.y;
double Z = p2.z - p1.z;
double c = (p2.x - point.x)*X + (p2.y - point.y)*Y + (p2.z - point.z)*Z;
double alpha = c/(X*X+Y*Y+Z*Z);
return alpha;
}
public double projeterAbsCurv(Point point) {
//La cr�ation de vecteur peut consommer du temps
Vecteur vecteur1 = new Vecteur(p1, point);
Vecteur vecteur2 = new Vecteur(p1, p2);
double angle = BasicGeo.liPi(vecteur1.getAngle() - vecteur2.getAngle());
double absCurv = Math.cos(angle)*vecteur1.getNorme();
//return absCurv;
double X = p2.x - p1.x;
double Y = p2.y - p1.y;
double Z = p2.z - p1.z;
double c = (p2.x - point.x)*X + (p2.y - point.y)*Y + (p2.z - point.z)*Z;
double alpha = c/(X*X+Y*Y+Z*Z);
return ((1-alpha)*longueur);
}
public double projeterDistance(Point point) {
//La cr�ation de vecteur peut consommer du temps
Vecteur vecteur1 = new Vecteur(p1, point);
Vecteur vecteur2 = new Vecteur(p1, p2);
double angle = BasicGeo.liPi(vecteur1.getAngle() - vecteur2.getAngle());
double distance = Math.abs(Math.sin(angle)*vecteur1.getNorme());
return distance;
}
public void load(DataInputStream dis) throws IOException {
super.load(dis);
}
public void save(DataOutputStream dos) throws IOException {
dos.writeShort(TypeElement.SEGMENT.ordinal());
super.save(dos);
}
}