void Projectile::advance(int phase) { if(!phase) return; if(depart.calculDistance(courante) > portee) { return ProjectileFactory::eraseProjectile(this); } courante.deplacer(cible.calculAngle(depart) * 57.3 + 180, getVitesse() * 1.0 / FREQ_RAF ); setX(courante.getXAffi()); setY(courante.getYAffi()); std::vector<Ennemi*> listeEnnemis = EnnemiFactory::getListeEnnemis(); for(unsigned int i(0);i<listeEnnemis.size();++i) // On parcourt le tableau. { if(typeEnnemi == TOUS || listeEnnemis[i]->getTypeDeplacement() == typeEnnemi) { Ennemi* ennemi = listeEnnemis[i]; if(this->collidesWithItem(ennemi)) { ennemi->recevoirProjectile(this); return; } } } }
double Vehicule::simulation(int temps, int deltaT) { double result = 0.0; //std::cout << "Simulation " << temps << ". "; if (temps > 0 && (temps * deltaT) % 1440 == 0) { setNeedToReset(true); } if (getEtatMouvActuel() != EN_TRAIN_DE_ROULER && getNeedToReset()) { reinitJour(); // on réinitialise certaines données à 00h00 chaque jour } int mouv(getEtatMouvActuel()); if (mouv == EN_TRAIN_DE_ROULER) { setSoc(std::max(0.0, getSoc() - 100.0 * (getVitesse() * deltaT/60.0) * (getConsommation() / getCapacite()))); setDistanceParcourue(getDistanceParcourue() + std::min(getDistanceRestante(), getVitesse() * deltaT/60.0)); // usage de 'min' pour éviter d'avoir une distance parcourue supérieure à la distance à parcourir initialement setDistanceRestante(std::max(0.0, getDistanceRestante() - getVitesse() * deltaT/60.0)); // usage de 'max' pour éviter d'avoir une distance restante négative } else if (mouv == BRANCHE_EN_CHARGE && getSoc() < 100) { setSoc(std::min(100.0, getSoc() + 100.0 * (deltaT/60.0) * (getPuissanceCharge() / getCapacite()))); //puissanceCharge() fonction qui peut dépendre des paramètres qu'on veut, pour anticiper le smartgrid de ce coté là aussi. // usage de 'min' pour éviter d'avoir un SOC > 100 result =getPuissanceCharge(); } transition(temps, deltaT); int mouvSuiv(getEtatMouvSuivant()); if (mouvSuiv == EN_TRAIN_DE_ROULER) { if (mouv != EN_TRAIN_DE_ROULER) { setPosition(getProchaineDestination()); setDistanceRestante(getLongueurTrajet()); incNbTrajetsEffectues(); } else { setEtatMouvActuel(getEtatMouvSuivant()); } } setEtatMouvActuel(getEtatMouvSuivant()); return result; // renvoie la puissance demandé à l'instant t par le VE }
void taskMotor(void* cookie) { OUT_MOTOR* out=(OUT_MOTOR*)cookie; double coef=0; double lastcoef=1; int time=0; double val; getVitesse(out);//initialise les variables while (1) { if(!rt_task_wait_period(NULL)) { lastcoef=coef; val=getVitesse(out); coef+=MOTOR_ASSERVISSEMENT*(out->vitesse- val); if(coef>1)coef=1; else if(coef<-1) coef=-1; if(1 || lastcoef>=0 && coef<0 || lastcoef<=0 && coef>0 || coef == 0 && lastcoef !=0){ GPIO_CLR = (coef<=0) << out->pinIN1 | (coef>=0) << out->pinIN2; GPIO_SET = (coef>0) << out->pinIN1 | (coef<0) << out->pinIN2; } time = COEFF_TO_TIME(coef); if(time > 0){ GPIO_SET = 1 << out->pinPWM; if(time < PERIODE_MOTOR){ rt_alarm_start(&(out->alarm), time, TM_INFINITE); if (!rt_alarm_wait(&(out->alarm))) { GPIO_CLR = 1 << out->pinPWM; } } } else { GPIO_CLR = 1 << out->pinPWM; } } } }
void Vehicule::computeSocMin(int deltaT) { if (socMin <= 0) { int nbTrajets(getNbTrajetsEffectues()); int nbTrajetsMax = getNbTrajets(); double longueurTrajet(getLongueurTrajet()); double distanceAvantBorne(longueurTrajet); while(!getAccesBornes(getDestination(nbTrajets % nbTrajetsMax)) && nbTrajets <= nbTrajetsMax){ nbTrajets++; distanceAvantBorne += longueurTrajet; } socMin = 100 * distanceAvantBorne * getConsommation() / getCapacite(); } else { socMin = socMin - 100 * (deltaT/60.0) * getVitesse() * getConsommation() / getCapacite(); } }
void Lapin::sauter() { Position newPos, oldPos = getPosition() ; int nbDep = getVitesse() ; while (nbDep > 0) { // On génère une position adjacente newPos = seDeplacer() ; while (!getMonde()->positionLibre(newPos)) newPos = seDeplacer() ; // On met à jour la position dans le monde setPosition(newPos) ; unsigned int indice = getMonde()->getMap().find(oldPos)->second ; getMonde()->getMap().erase(oldPos) ; getMonde()->getMap().insert(pair<Position, unsigned>(newPos, indice)) ; } }