Advertisement
Guest User

Untitled

a guest
Aug 19th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.19 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <cmath>
  3. #include <cstdio>
  4.  
  5.  
  6. // sugerowana prędkość w zależności od odległości od przeszkody
  7. double v_dist( double dist ) {
  8.     double vd =  (dist-1) / 10;
  9.     if( vd < 0 ) vd = 0;
  10.     return vd;
  11. }
  12.  
  13. double pp = 30000; // pozycja przeszkody
  14. double poprawka_hamowania( double s , double v , double masa, double fham , double *fsil , double fstat , double fdyn ) {
  15.     double vd = ( s - pp );
  16.     if( vd <= v )  // czy prędkość nie jest za duża?
  17.         return 0;
  18.     *fsil = 0;     // wyłączamy silnik
  19.     //(vd - v) / t == a
  20.     // a == ( fham + fsil + fstat + fdyn ) / masa
  21.     //(vd - v) / t = ( fham + fsil + fstat + fdyn ) / masa
  22.     //(vd - v) / t  = fham/masa + fsil/masa + fstat/masa + fdyn/masa
  23.     // fham = ((vd - v)/t - fsil/masa - fstat/masa - fdyn/masa)*masa
  24.     double new_fham = ((vd - v)/1 - fstat/masa - fdyn/masa)*masa;
  25.     if( fabs(v) < 0.001 )
  26.         new_fham = 0;
  27.     else if( v < 0 )
  28.         new_fham = fabs(new_fham);
  29.     else
  30.         new_fham = -fabs(new_fham);
  31.  
  32.     if( fabs(fham) < fabs(new_fham) )
  33.         return new_fham;
  34.     return fham;
  35. }
  36.  
  37. int main(int argc, char *argv[])
  38. {
  39.     double masa = 2000;   // kg
  40.     double s    = 0;      // odległość od zera
  41.     double dt   = 0.0001;  // s
  42.     double v    = 0;      // pręskość m/s
  43.     double wtd  = 0.6;    // współczynnik tarcia dyn
  44.     double wts  = 0.1;    // współczynnik tarcia stat
  45.     double t    = 0;      // czas początkowy
  46.     double pow  = 1.0;    // powierzchnia natarcia w m^2
  47.  
  48.     while( t < 2000 ) {
  49.         double fsil;
  50.         double fham;
  51.  
  52.         if( t < 350 ) {                        // przez 200 sekund rozpędzamy się silniiem z siłą 500N
  53.             fsil = 500;
  54.             fham =    0;
  55.         } else if( t < 600 ){                  // potem wyłączamy silnik i hamujemy z siłą 500N
  56.             fsil =    0;
  57.             fham =  500;
  58.         } else if( t < 850 ) {                 // rozpędzamy się z siłą 1500N
  59.             fsil = 1500;
  60.             fham =    0;
  61.         } else {                               // samochód jedzie bez hamowania i rozpędzania
  62.             fsil =    0;
  63.             fham =    0;
  64.         }
  65.  
  66.         double fdyn  = v*v*wtd*pow;            // tarcie aerodynamiczne
  67.         double fstat = masa * wts * v * dt;    // tarcie statyczne
  68.  
  69.         if( fabs(v) < 0.001 ) {                // gdy prędkość jest zerowa to sily tarcia przestają działać
  70.             fham = 0;
  71.             fdyn = 0;
  72.             fstat = 0;
  73.         } else if( v < 0 ) {                   // wszystkie siły tarcia zawsze w przeciwnym kierunku do prędkości
  74.             fham  = fabs(fham);
  75.             fdyn  = fabs(fdyn);
  76.             fstat = fabs(fstat);
  77.         } if( v > 0 ) {                        // wszystkie siły tarcia zawsze w przeciwnym kierunku do prędkości
  78.             fham  = -fabs(fham);
  79.             fdyn  = -fabs(fdyn);
  80.             fstat = -fabs(fstat);
  81.         }
  82.         fham  = poprawka_hamowania( s , v , masa , fham , &fsil , fstat , fdyn );
  83.  
  84.         double f = fsil + fham + fdyn + fstat; // wypadkowa siła
  85.         double a = f / masa;                   // przyspieszenie w chwili t
  86.         v = v + a * dt;                        // prędkość w chwili t
  87.         s = s + v * dt;                        // odległość od punkut startowego w chwili t
  88.         t = t + dt;
  89.         static double last_t = -1;
  90.         if( abs(last_t-t) > 1.0 ) {           // wyświetlanie raz na sekundę
  91.             printf(" %+8.4lf %+8.4lf %+8.4lf \n",a,v,s/1000);
  92.             last_t = t;
  93.         }
  94.     }
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement