pietrod21

pianeti

Dec 22nd, 2011
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.85 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4.  
  5. #define dt 0.1
  6. #define M 332000
  7. #define teu 39,4784176
  8. ///////////////////////////////////////////////////////////struct
  9. struct vett{
  10.     double x,y;
  11.     };    
  12.  
  13. struct punto{
  14.     struct vett p,v;
  15.     double m;  
  16. };
  17.  
  18. struct posizioni{
  19.     struct punto A,B;
  20. }pos;
  21. //////////////////////////////////////////////////////////funzioni
  22. struct vett a(double vx,double vy,double ventx,double venty, double fA);
  23. struct posizioni verlet(struct posizioni);
  24. //////////////////////////////////////////////////////////main
  25. main(){
  26. int i;
  27. FILE *fp;
  28. fp=fopen("pianeti.c","w+");
  29. pos.A.m=1;
  30. pos.B.m=0.5;
  31. pos.A.p.x=60;
  32. pos.A.p.y=60;
  33. pos.B.p.x=30;
  34. pos.B.p.y=40;
  35. pos.A.v.x=-30;
  36. pos.A.v.y=-30;
  37. pos.B.v.x=-50;
  38. pos.B.v.y=-60;
  39.  
  40.  
  41. for(i=0;i<1000;i++){
  42.     fprintf(fp,"%lf %lf %lf %lf %lf\n",i*dt,pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.B.p.y);
  43.     pos=verlet(pos);
  44. }
  45.  
  46. }
  47. //////////////////////////////////////////////////////////funzioni
  48. struct vett a(double xa,double ya,double xb,double yb, double m){
  49.     double acc;
  50.     acc=teu*xa/pow(sqrt(xa*xa+ya*ya),3)+teu*(-m/M)*(xa-xb)/pow((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb)),3);
  51.     return acc;
  52. }
  53.  
  54. struct posizioni verlet(struct posizioni){
  55.     //ottengo x(n+1) per ottenere l'accelerazione di v(n+1): per farlo creo delle nuove struct "temporanee" A1 e B1
  56.     struct posizioni A1, B1;
  57.     pos.A1.p.x=pos.A.p.x+pos.A.v.x*dt+0.5*a(pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.A.p.y,pos.B.m)*dt*dt;
  58.     pos.A1.p.y=pos.A.p.y+pos.A.v.y*dt+0.5*a(pos.A.p.y,pos.A.p.x,pos.B.p.y,pos.A.p.x,pos.B.m)*dt*dt;
  59.     pos.B1.p.x=pos.B.p.x+pos.B.v.x*dt+0.5*a(pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.A.p.y,pos.A.m)*dt*dt;
  60.     pos.B1.p.y=pos.B.p.y+pos.B.v.y*dt+0.5*a(pos.A.p.y,pos.A.p.x,pos.B.p.y,pos.A.p.x,pos.A.m)*dt*dt;
  61.     //ottengo le nuove velocità-  sfruttando le A1 e B1 precedentemente ricavate - sovrascrivendole direttamente alle vecchie
  62.     pos.A.v.x=pos.A.v.x+0.5+(a(pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.A.p.y,pos.A.m)+a(pos.A1.p.x,pos.A1.p.y,pos.B1.p.x,pos.A1.p.y,pos.B.m))*dt;
  63.     pos.A.v.y=pos.A.v.y+0.5+(a(pos.A.p.y,pos.A.p.x,pos.B.p.y,pos.A.p.x,pos.A.m)+a(pos.A1.p.y,pos.A1.p.x,pos.B1.p.y,pos.A1.p.x,pos.B.m))*dt;
  64.     pos.B.v.x=pos.B.v.x+0.5+(a(pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.A.p.y,pos.A.m)+a(pos.A1.p.x,pos.A1.p.y,pos.B1.p.x,pos.A1.p.y,pos.A.m))*dt;
  65.     pos.B.v.y=pos.B.v.y+0.5+(a(pos.A.p.y,pos.A.p.x,pos.B.p.y,pos.A.p.x,pos.A.m)+a(pos.A1.p.y,pos.A1.p.x,pos.B1.p.y,pos.A1.p.x,pos.A.m))*dt;
  66.     //ottengo le nuove posizioni sovrascrivendole direttamente alle vecchie
  67.     pos.A.p.x=pos.A.p.x+pos.A.v.x*dt+0.5*a(pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.A.p.y,pos.B.m)*dt*dt;
  68.     pos.A.p.y=pos.A.p.y+pos.A.v.y*dt+0.5*a(pos.A.p.y,pos.A.p.x,pos.B.p.y,pos.A.p.x,pos.B.m)*dt*dt;
  69.     pos.B.p.x=pos.B.p.x+pos.B.v.x*dt+0.5*a(pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.A.p.y,pos.A.m)*dt*dt;
  70.     pos.B.p.y=pos.B.p.y+pos.B.v.y*dt+0.5*a(pos.A.p.y,pos.A.p.x,pos.B.p.y,pos.A.p.x,pos.A.m)*dt*dt;
  71.     return pos;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment