Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdlib>
- #include <cmath>
- #include <cstdio>
- // sugerowana prędkość w zależności od odległości od przeszkody
- double v_dist( double dist ) {
- double vd = (dist-1) / 10;
- if( vd < 0 ) vd = 0;
- return vd;
- }
- double pp = 30000; // pozycja przeszkody
- double poprawka_hamowania( double s , double v , double masa, double fham , double *fsil , double fstat , double fdyn ) {
- double vd = ( s - pp );
- if( vd <= v ) // czy prędkość nie jest za duża?
- return 0;
- *fsil = 0; // wyłączamy silnik
- //(vd - v) / t == a
- // a == ( fham + fsil + fstat + fdyn ) / masa
- //(vd - v) / t = ( fham + fsil + fstat + fdyn ) / masa
- //(vd - v) / t = fham/masa + fsil/masa + fstat/masa + fdyn/masa
- // fham = ((vd - v)/t - fsil/masa - fstat/masa - fdyn/masa)*masa
- double new_fham = ((vd - v)/1 - fstat/masa - fdyn/masa)*masa;
- if( fabs(v) < 0.001 )
- new_fham = 0;
- else if( v < 0 )
- new_fham = fabs(new_fham);
- else
- new_fham = -fabs(new_fham);
- if( fabs(fham) < fabs(new_fham) )
- return new_fham;
- return fham;
- }
- int main(int argc, char *argv[])
- {
- double masa = 2000; // kg
- double s = 0; // odległość od zera
- double dt = 0.0001; // s
- double v = 0; // pręskość m/s
- double wtd = 0.6; // współczynnik tarcia dyn
- double wts = 0.1; // współczynnik tarcia stat
- double t = 0; // czas początkowy
- double pow = 1.0; // powierzchnia natarcia w m^2
- while( t < 2000 ) {
- double fsil;
- double fham;
- if( t < 350 ) { // przez 200 sekund rozpędzamy się silniiem z siłą 500N
- fsil = 500;
- fham = 0;
- } else if( t < 600 ){ // potem wyłączamy silnik i hamujemy z siłą 500N
- fsil = 0;
- fham = 500;
- } else if( t < 850 ) { // rozpędzamy się z siłą 1500N
- fsil = 1500;
- fham = 0;
- } else { // samochód jedzie bez hamowania i rozpędzania
- fsil = 0;
- fham = 0;
- }
- double fdyn = v*v*wtd*pow; // tarcie aerodynamiczne
- double fstat = masa * wts * v * dt; // tarcie statyczne
- if( fabs(v) < 0.001 ) { // gdy prędkość jest zerowa to sily tarcia przestają działać
- fham = 0;
- fdyn = 0;
- fstat = 0;
- } else if( v < 0 ) { // wszystkie siły tarcia zawsze w przeciwnym kierunku do prędkości
- fham = fabs(fham);
- fdyn = fabs(fdyn);
- fstat = fabs(fstat);
- } if( v > 0 ) { // wszystkie siły tarcia zawsze w przeciwnym kierunku do prędkości
- fham = -fabs(fham);
- fdyn = -fabs(fdyn);
- fstat = -fabs(fstat);
- }
- fham = poprawka_hamowania( s , v , masa , fham , &fsil , fstat , fdyn );
- double f = fsil + fham + fdyn + fstat; // wypadkowa siła
- double a = f / masa; // przyspieszenie w chwili t
- v = v + a * dt; // prędkość w chwili t
- s = s + v * dt; // odległość od punkut startowego w chwili t
- t = t + dt;
- static double last_t = -1;
- if( abs(last_t-t) > 1.0 ) { // wyświetlanie raz na sekundę
- printf(" %+8.4lf %+8.4lf %+8.4lf \n",a,v,s/1000);
- last_t = t;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement