pietrod21

proiettile/vento (cartesiano))

Nov 14th, 2011
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.89 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #define g 9.81
  5. #define epsilon 0.1
  6. #define dt 0.01
  7.  
  8. ///////////////////////////////////////////////////////////struct
  9. struct vett{
  10.     double x,y;
  11.     }vento;    //creo la struttura vettore e contestualmente creo un vettore vento (si può fare aggiungendo typedef)
  12.  
  13.  
  14. struct punto{
  15.     struct vett p,v,a;  //creo struttura che segue il punto in tutti i suoi valori (//)
  16. }punt;
  17.            
  18.  
  19. //////////////////////////////////////////////////////////funzioni
  20. struct vett aa(double vx,double vy,double ventx,double venty, double fA);
  21. struct punto kutta(struct punto fpunt, struct vett fvento, double fA);
  22.  
  23. //---------------------
  24. main(){
  25. int i=0;
  26. double A=0.1, k, m;
  27. printf("velocità iniziale su x e' %lf su y %lf \n",vento.x,vento.y);
  28.  
  29. printf("inserimento dati iniziali del proiettile \n");////////////////proiettile
  30. printf("inserire posizione iniziale punto su x \n");
  31. scanf("%lf", &punt.p.x);
  32. printf("inserire posizione iniziale punto su y \n");
  33. scanf("%lf", &punt.p.y);
  34. printf("inserire velocità iniziale punto su x \n");
  35. scanf("%lf", &punt.v.x);
  36. printf("inserire velocità iniziale punto su y \n");
  37. scanf("%lf", &punt.v.y);
  38. printf("inserimento dati iniziali del vento \n");/////////////////////vento
  39. printf("velocità iniziale vento su x \n");
  40. scanf("%lf", &vento.x);
  41. printf("velocità iniziale vento su y \n");
  42. scanf("%lf", &vento.y);
  43. printf("controllo dati inseriti");/////////////////////////////////controllo
  44. printf("px=%lf,py=%lf,vx=%lf,vy=%lf,ax=%lf,ay=%lf \n", punt.p.x,punt.p.y,punt.v.x,punt.v.y,punt.a.x,punt.a.y);
  45. double hstart=punt.p.y;
  46.  
  47.     FILE* fp=fopen("proiettile.dat","w");
  48.         fprintf(fp, "px=        py=        vx=       vy=     ax=         ay= \n");
  49.     do{  
  50.         fprintf(fp, " %lf %lf %lf %lf %lf %lf \n", punt.p.x,punt.p.y,punt.v.x,punt.v.y,punt.a.x,punt.a.y);
  51.         punt=kutta(punt, vento, A);
  52.     }while(punt.p.y>hstart);
  53.  
  54.  
  55. }
  56. //---------------------
  57.  
  58.  
  59. struct vett aa(double vx,double vy,double ventx,double venty, double fA){ //prende le velocità del proiettile e del vento e scrive - tramite puntatore - l'accelerazione risultante nella struct punt.a
  60.         //printf("scrittura aa aa aa %lf %lf %lf %lf %lf %lf \n", punt.p.x,punt.p.y,punt.v.x,punt.v.y,punt.a.x,punt.a.y);
  61.     struct vett acc;
  62.     acc.x=-fA*fabs(vx-ventx)*(vx-ventx);
  63.     acc.y=-fA*fabs(vy-venty)*(vy-venty)-g;
  64.         //printf(" vettore acc %lf %lf \n", acc.x, acc.y);
  65.     return acc;
  66. }
  67.  
  68. struct punto kutta(struct punto fpunt, struct vett fvento, double fA){
  69.  
  70.     double x[5],y[5],vx[5],vy[5],ax[5],ay[5],ventx[5],venty[5];
  71.     struct vett a[5];
  72.  
  73.     x[0]=fpunt.p.x;  //deposito il contenuto della struct fpunt in più array
  74.     y[0]=fpunt.p.y;
  75.     vx[0]=fpunt.v.x;
  76.     vy[0]=fpunt.v.y;
  77.     ventx[0]=fvento.x;
  78.     venty[0]=fvento.y;
  79.    
  80. //inizio algoritmo
  81.  
  82.     a[0]=aa(vx[0],vy[0],ventx[0],venty[0],fA);  //eseguo aa(...) per ottenere l'accelerazione, che verrà scritta nell'array struct a[]
  83.             //printf("A0=%lf %lf \n", a[0].x,a[0].y);
  84.     vx[1]=a[0].x*dt;
  85.     x[1]=vx[0]*dt;
  86.     vy[1]=a[0].y*dt;
  87.     y[1]=vy[0]*dt;
  88.  
  89.     a[1]=aa(vx[0]+0.5*vx[1],vy[0]+0.5*vy[1],ventx[0]+0.5*ventx[1],venty[0]+0.5*venty[1],fA);
  90.     vx[2]=a[1].x*dt;
  91.     x[2]=(vx[0]+0.5*vx[1])*dt;
  92.     vy[2]=a[1].y*dt;
  93.     y[2]=(vy[0]+0.5*vy[1])*dt;
  94.  
  95.     a[2]=aa(vx[0]+0.5*vx[2],vy[0]+0.5*vy[2],ventx[0]+0.5*ventx[2],venty[0]+0.5*venty[2],fA);
  96.     vx[3]=a[2].x*dt;
  97.     x[3]=(vx[0]+0.5*vx[2])*dt;
  98.     vy[3]=a[2].y*dt;
  99.     y[3]=(vy[0]+0.5*vy[2])*dt;
  100.  
  101.     a[3]=aa(vx[0]+vx[3],vy[0]+vy[3],ventx[0]+ventx[3],venty[0]+venty[3],fA);
  102.     vx[4]=a[3].x*dt;
  103.     x[4]=(vx[0]+vx[3])*dt;
  104.     vy[4]=a[3].y*dt;
  105.     y[4]=(vy[0]+vy[3])*dt;
  106.  
  107.    
  108.     fpunt.p.x=x[0]+(x[1]+2*x[2]+2*x[3]+x[4])/6;
  109.     fpunt.p.y=y[0]+(y[1]+2*y[2]+2*y[3]+y[4])/6;
  110.     fpunt.v.x=vx[0]+(vx[1]+2*vx[2]+2*vx[3]+vx[4])/6;
  111.     fpunt.v.y=vy[0]+(vy[1]+2*vy[2]+2*vy[3]+vy[4])/6;
  112.     fpunt.a.x=ax[0];
  113.     fpunt.a.y=ay[0];
  114. //printf("px=%lf,py=%lf,vx=%lf,vy=%lf,ax=%lf,ay=%lf \n", punt.p.x,punt.p.y,punt.v.x,punt.v.y,punt.a.x,punt.a.y);
  115.     return fpunt;
  116.  
  117. }
Advertisement
Add Comment
Please, Sign In to add comment