Advertisement
wandrake

Untitled

Jul 24th, 2011
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. #define DELTA   0.1
  6. #define NSEC    1000
  7.  
  8. typedef struct point {
  9.     double x;
  10.     double y;
  11. } point_t;
  12.  
  13. typedef struct velocity {
  14.     double x;
  15.     double y;
  16. } velocity_t;
  17.  
  18. typedef struct planet {
  19.     point_t p;
  20.     velocity_t v;
  21.     double mass;
  22. } planet_t;
  23.  
  24. const double G = 6.67428e-11;
  25.  
  26. planet_t sun = { {0.0, 0.0}, {0.0, 0.0}, 330000*5.9742e+24 };
  27.  
  28. planet_t p1 = { {0.0, 150000000e+3}, {0.0, 0.0}, 5.9742e+24 };
  29. planet_t p2 = { {0.0, 4700+150000000e+3}, {0.0, 0.0}, 7.347673e+22 }
  30.  
  31. /*planet_t p1 = { {0.0, 0.0}, {0.0, 0.0}, 5.9742e+24 };
  32. planet_t p2 = { {0.0, 4700.0e+3}, {0.0, 0.0}, 7.347673e+22 };
  33.  
  34. planet_t proiettile = { {0.0, 3200.0e+3}, {0, 0}, 1 };*/
  35.  
  36. double gfield[2];
  37.  
  38. double dist(planet_t* p1, planet_t* p2) {
  39.     double tmp1;
  40.     tmp1 = pow(p1->p.x - p2->p.x, 2) + pow(p1->p.y - p2->p.y, 2);
  41.     printf("%f\n", tmp1);
  42.     return sqrt(tmp1);
  43. }
  44.  
  45. void calc_gfield(double x, double y) {
  46.     double tmp1, tmp2;
  47.     double distquad;
  48.  
  49.     gfield[0] = 0;
  50.     gfield[1] = 0;
  51.  
  52.     /* Contributo di sun */
  53.  
  54.     if (x != sun.p.x && y != sun.p.x) {
  55.         distquad = pow(sqrt(pow(x-sun.p.x, 2)+pow(y-sun.p.y, 2)), 3);
  56.         tmp1 = G*sun.mass;
  57.         tmp2 = tmp1/distquad;
  58.  
  59.         gfield[0] -= tmp2*(x-sun.p.x);
  60.         gfield[1] -= tmp2*(y-sun.p.y);
  61.     }
  62.  
  63.     /* Contributo di p1 */
  64.  
  65.     if (x != p1.p.x && y != p1.p.y) {
  66.         distquad = pow(sqrt(pow(x-p1.p.x, 2)+pow(y-p1.p.y, 2)), 3);
  67.         tmp1 = G*p1.mass;
  68.         tmp2 = tmp1/distquad;
  69.  
  70.         gfield[0] -= tmp2*(x-p1.p.x);
  71.         gfield[1] -= tmp2*(y-p1.p.y);
  72.     }
  73.  
  74.     /* Contributo di p2 */
  75.  
  76.     if (x != p2.p.x && y != p2.p.y) {
  77.         distquad = pow(sqrt(pow(x-p2.p.x, 2)+pow(y-p2.p.y, 2)), 3);
  78.         tmp1 = G*p2.mass;
  79.         tmp2 = tmp1/distquad;
  80.  
  81.         gfield[0] -= tmp2*(x-p2.p.x);
  82.         gfield[1] -= tmp2*(y-p2.p.y);
  83.     }
  84.  
  85. }
  86.  
  87. int main(int argc, char* argv[]) {
  88.     int t;
  89.     FILE* out;
  90.  
  91.     out = fopen("asd", "w");
  92.  
  93.     fprintf(out, "#X\tY\n");
  94.  
  95.     int count = 0;
  96.  
  97.     /* Il proiettile viaggia auna velocità che gli permette
  98.      * di orbitare intorno alla terra, più forte ed esce dall'orbita
  99.      * più piano e cade sulla terra */
  100.  
  101. /*    proiettile.v.x = sqrt(G*p1.mass/dist(&proiettile, &p1));
  102.     proiettile.v.y = 0;*/
  103.  
  104.     p1.v.x = sqrt(G*sun.mass/dist(&p1, &sun));
  105.     p1.v.y = 0;
  106.  
  107.     p2.v.x = sqrt(G*p1.mass/dist(&p1, &p2))+sqrt(G*sun.mass/dist(&p2, &sun));
  108.     p2.v.y = 0;
  109.  
  110.     while (count < 100000) {
  111.         double e_field[2];
  112.         double e_vel[2];
  113.  
  114.         double m_field[2];
  115.         double m_vel[2];
  116.  
  117.         double tmpv[2];
  118.  
  119. /*        fprintf(out, "%f\t%f\n", proiettile.p.x, proiettile.p.y);*/
  120.         fprintf(out, "%f\t%f\n", p1.p.x, p1.p.y);
  121.         fprintf(out, "%f\t%f\n", p2.p.x, p2.p.y);
  122.  
  123.         /* Salvo accelerazione e velocità correnti per la terra */
  124.  
  125.         calc_gfield(p1.p.x, p1.p.y);
  126.         e_field[0] = gfield[0];
  127.         e_field[1] = gfield[1];
  128.  
  129.         e_vel[0] = p1.v.x;
  130.         e_vel[1] = p1.v.y;
  131.  
  132. /*        printf("g: (%f, %f), v: (%f, %f)\n", e_field[0], e_field[1], p1.v.x, p2.v.x);*/
  133.  
  134.         /* Salvo accelerazione e velocità correnti per la luna */
  135.  
  136.         calc_gfield(p2.p.x, p2.p.y);
  137.         m_field[0] = gfield[0];
  138.         m_field[1] = gfield[1];
  139.  
  140.         m_vel[0] = p2.v.x;
  141.         m_vel[1] = p2.v.y;
  142.  
  143.         /* Calcolo l'incremento della terra */
  144.  
  145.         p1.v.x += DELTA*e_field[0];
  146.         p1.v.y += DELTA*e_field[1];
  147.  
  148.         p1.p.x += DELTA*e_vel[0];
  149.         p1.p.y += DELTA*e_vel[1];
  150.  
  151.         /* Calcolo l'incremento della luna */
  152.  
  153.         p2.v.x += DELTA*m_field[0];
  154.         p2.v.y += DELTA*m_field[1];
  155.  
  156.         p2.p.x += DELTA*m_vel[0];
  157.         p2.p.y += DELTA*m_vel[1];
  158.  
  159.         /* Calcolo l'incremento del proiettile */
  160.  
  161. /*        calc_gfield(proiettile.p.x, proiettile.p.y);
  162.         tmpv[0] = proiettile.v.x;
  163.         tmpv[1] = proiettile.v.y;
  164.  
  165.         proiettile.v.x += DELTA*gfield[0];
  166.         proiettile.v.y += DELTA*gfield[1];
  167.  
  168.         proiettile.p.x += DELTA*tmpv[0];
  169.         proiettile.p.y += DELTA*tmpv[1];*/
  170.  
  171.         count++;
  172.     }
  173.  
  174.     return 0;
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement