Teaching - 2i013

Enseignants


2i013 - Groupe 5 : Course de voiture

Code de la voiture qui dérape pour ceux qui souhaite le tester:

 public class VoitureImpl implements Voiture{

	private double[] tabVitesse 	= {0.1,	0.2, 0.3, 0.4, 0.5,	0.6, 0.7, 0.8,	0.9, 1.}; 
	private double[] tabTurn 		= {1., 1., 0.8, 0.7, 0.6, 0.4,	0.3,0.2, 0.1, 0.075};

	private final double vmax, braquage;
	private final double alpha_c, alpha_f, beta_f, alpha_derapage;


	private double vitesse;
	private Vecteur position;
	private Vecteur direction;

	private boolean derapage;
	private double sens_derapage;

	private double vitesse_sortie_derapage;

	private Vecteur direction_derapage;


	public VoitureImpl(double vmax, double braquage, double alpha_c,
			double alpha_f, double beta_f, double alpha_derapage,
			double vitesse, Vecteur position, Vecteur direction,
			 double vitesse_sortie_derapage) {
		super();
		this.vmax = vmax;
		this.braquage = braquage;

		this.alpha_c = alpha_c;
		this.alpha_f = alpha_f;
		this.beta_f = beta_f;
		this.alpha_derapage = alpha_derapage;
		this.vitesse = vitesse;
		this.position = position;
		this.direction = direction;
		this.vitesse_sortie_derapage = vitesse_sortie_derapage;
		this.direction_derapage = null;


		this.derapage = false;
		sens_derapage = 1; // 1 ou -1

	}

	public void drive(Commande c) throws VoitureException {		
		controlCommand(c);

		if(!derapage && detection_derapage(c))
			debut_derapage(c);

		if(derapage)
			driveAvecDerapage(c);
		else
			driveSansDerapage(c);	
	}

	private void controlCommand(Commande c) throws VoitureException{
		if(c.getAcc()>1. || c.getAcc()<-1. || c.getTurn() >1. || c.getTurn() <-1.)
			throw new VoitureException("car command out of bounds (+1/-1)");
	}

	private void driveSansDerapage(Commande c) {
		// approche normale
		// 1) gestion du volant
		direction.rotation(c.getTurn() * braquage);

		// 2.1) gestion des frottements

		vitesse -= alpha_f;
		vitesse -= beta_f*vitesse;

		// 2.2) gestion de l'acceleration/freinage

		vitesse += c.getAcc() * alpha_c;

		// 2.3) garanties, bornes...
		direction.toUnitVec();

		vitesse = Math.max(0., vitesse); // pas de vitesse négative
		vitesse = Math.min(vmax, vitesse);

		// 3) mise à jour de la position

		position.autoAdd(direction.fact(vitesse));
	}


	private void driveAvecDerapage(Commande c) {

		// freinage quelque soit la commande
		vitesse -= alpha_derapage;
		vitesse = Math.max(0., vitesse);

		// maj de la direction
		direction.rotation(Math.signum(c.getTurn()) * getMaxTurnSansDerapage() * braquage); // mod 2013
		direction_derapage.rotation(sens_derapage * getMaxTurnSansDerapage() * braquage * 1.1); // mod 2013

		// avance un peu selon
		position.autoAdd(direction.fact(vitesse));

		if(vitesse < vitesse_sortie_derapage )
			fin_derapage();

	}

	public double getMaxTurnSansDerapage() {
		for(int i=0; i<tabVitesse.length; i++)
			if(vitesse<=tabVitesse[i])
				return tabTurn[i];
		return 1.;
	}

	private boolean detection_derapage( Commande c){
		if(Math.abs(c.getTurn()) > getMaxTurnSansDerapage())
			return true;
		return false;
	}

	private void fin_derapage() {
		derapage = false;
		direction = direction_derapage.cloneAsVecteur();

	}

	private void debut_derapage(Commande c){
		derapage = true;

		vitesse_sortie_derapage = 0.75 * vitesse; // 2013
		sens_derapage =  Math.signum(c.getTurn());
		direction_derapage = direction.cloneAsVecteur();
	}

	public boolean getDerapage() {
		return derapage;
	}

	public Vecteur getDirection() {
		return direction;
	}

	public Vecteur getPosition() {
		return position;
	}

	public double getBraquage(){
		return braquage;
	}

	public double getVitesse() {
		return vitesse;
	}

	public String toString(){
		return "P: "+position.toString()+" D: "+direction+" V: "+vitesse;
	}


 }