C语言编码小球斜抛运动,利用C4droid绘制小球斜抛运动轨迹(考虑空气阻力)
該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
我把源代碼分享出來,歡迎有興趣的朋友下載測試,修改優化。
/***********************************************************************
此程序是考慮空氣阻力條件下彈弓拋射8mm鋼珠飛行軌跡的C++程序。
用到的公式:空氣阻力的公式:F=(1/2)CρSV^2
計算.式中:C為空氣阻力系數;ρ為空氣密度;S物體迎風面積;V為物體與空氣的相對
運動速度.但是C是空氣阻力系數。
一些物體的風阻:垂直平面體風阻系數大約1.0 球體風阻系數大約0.5 一般轎車
風阻系數0.28-0.4 好些的跑車在0.25 賽車可以達到0.15 飛禽在0.1-0.2 飛機達到0.08
目前雨滴的風阻系數最小 在0.05左右。
作者:哈笛 時間:2019年10月19日
************************************************************************/
#include
#include
#include "SDL2/SDL.h"
#include
#include #define G 9.8
#define Pi 3.14159265359SDL_Window *win=NULL;
SDL_Renderer *render=NULL;
int main()
{
int i,j,k,k1; //for循環用的變量
float s,v,vt,vx,vy,theta_jd,theta_hd,F,Fy,C,P,S,Sy,Sy0,a,ay,m,T,T1,T2,tb,SS,ss,wc;
//v是鋼珠的初速度,vt是鋼珠水平方向的即時速度,vx,vy是鋼珠水平、垂直方向的即時速度,theta_jd是射出角的角度表示,theta_jd是射出角的弧度表示,F是水平方向的空氣阻力,
//Fy是垂直方向的空氣阻力,C是鋼珠的空氣阻力系數,P是空氣密度,S是小球的迎風面積,Sy是小球垂直方向的位移,Sy0是鋼珠在單位時間tb內的垂直方向的位移,
//a是鋼珠水平方向的加速度,ay是鋼珠在垂直方向的加速度,m是鋼珠的質量,T是鋼珠總的飛行時間,T1是鋼珠上升時間,T2是鋼珠的下降時間,tb是單位時間,
//SS是鋼珠水平方向的位移,ss是鋼珠在單位時間tb內水平方向的位移,wc是理想瞄準位置與彈著點的偏差距離。
float x[1000],y[1000]; //用來標記單位時間鋼珠水平、垂直方向位置的數組
FILE *fp; /*文件指針*/
int len; /*行字符個數*/
v=90; //鋼珠射出的初速度
C=0.5; //鋼珠的風阻系數
P=1.2; //空氣密度
S=Pi*0.008*0.008; //鋼珠的迎風面積
m=5.29*0.001; //鋼珠的質量
/*for(theta_jd=1;theta_jd<=45;theta_jd++)
{
theta_hd=(Pi*theta_jd)/180;
s=(v*v*sin(2*theta_hd))/G;
printf("theta=%d s=%f ",theta_jd,s);
if(theta_jd%5==0) printf("\n");
}*/
theta_jd=37; //鋼珠的射出角度
theta_hd=(Pi*theta_jd)/180; //射出角度的弧度制表示
printf("\n");
vy=v*sin(theta_hd); //鋼珠在垂直方向的初速度
Fy=C*P*S*vy*vy/2; //鋼珠在垂直方向的空氣阻力
ay=-(Fy/m+G); //鋼珠在垂直方向的加速度(上升階段)
tb=0.01; //單位時間,0.01秒,用于將鋼珠的飛行等分為若干小段,在每小段內鋼珠為勻加速運動,該參數可以控制精度
T1=0; //上升階段的飛行時間
T2=0; //下降階段的飛行時間
Sy=0; //垂直方向的位移
i=0; //用于計算在上升階段經歷了少個單位時間,也用于垂直方向的坐標計算
while(vy>0) //此循環用于處理垂直向上運動,每個單位時間計算各項參數,結束條件為垂直方向速度小于等于0
{
vy=vy+ay*tb; //利用加速度、速度公式計算單位時間垂直方向的即時速度
Sy0=vy*tb+ay*tb*tb/2; //利用加速度、速度、位移公式計算單位時間垂直方向的位移
Sy+=Sy0; //對垂直方向的位移進行累加
Fy=C*P*S*vy*vy/2; //重新計算垂直方向的即時空氣阻力
ay=-(Fy/m+G); //重新計算垂直方向的即時加速度
T1+=tb; //累加垂直方向的位移
y[i]=Sy; //將垂直方向的坐標存入數組y[i],數組的下標是時間單位,內容是單位時間垂直方向的位移
i++; //對數組下標進行累加,同時對用掉的單位時間進行計數
}
vy=0; //垂直方向的速度歸零,準備處理垂直向下運動
Fy=C*P*S*vy*vy/2; //垂直方向的空氣阻力,初值為零
ay=-Fy/m+G; //垂直方向的加速度
while(Sy>0) //此循環用于處理垂直向下運動,每個單位時間計算各項參數,結束條件為垂直向下的位移等于垂直向上的位移
{
vy=vy+ay*tb; //利用加速度、速度公式計算單位時間垂直方向的即時速度
Sy0=vy*tb+ay*tb*tb/2; //利用加速度、速度、位移公式計算單位時間垂直方向的位移
Sy-=Sy0; //對垂直方向的位置坐標進行計算
y[i]=Sy;//將垂直方向的坐標存入數組y[i],數組的下標是時間單位,內容是單位時間垂直方向的位移
i++; //對數組下標進行累加,同時對用掉的單位時間進行計數,最終值為數組元素的最大個數
Fy=C*P*S*vy*vy/2; //重新計算垂直方向的即時空氣阻力
ay=-Fy/m+G; //重新計算垂直方向的即時加速度
T2+=tb; //累計垂直向下運動的時間
}
//T=2*v*sin(theta_hd)/G;
T=T1+T2; //計算運動時間
printf("T=%f ",T); //輸出運動時間
vx=v*cos(theta_hd); //計算水平方向的初速度
F=C*P*S*vx*vx/2; //計算水平方向的空氣阻力
a=-F/m; //計算水平方向的加速度
vt=v*cos(theta_hd);//計算水平方向的即時速度
/*t=T/1000;
SS=0;
for(i=1;i<=1000;i++)
{
ss=vt*t+a*t*t/2;
vt=vt+a*t;
if(vt<=0) break;
F=C*P*S*vt*vt/2;
a=-F/m;
SS+=ss;
}*/
SS=0; //SS為水平方向的位移量
j=0; //j是水平坐標值的下標
while(T>=0) //此循環用于處理水平方向的運動,每個單位時間動態計算各項參數的值,結束條件為水平運動的事件與垂直方向運動的總時間相等
{
ss=vt*tb+a*tb*tb/2; //利用速度、時間、加速度動態計算水平方向的位移
vt=vt+a*tb; //動態計算每個事件段結束時水平方向的即時速度
if(vt<=0) break; //如果出現水平速度為負,跳出循環
F=C*P*S*vt*vt/2; //動態計算每個時間間隔結束后水平方向的空氣阻力
a=-F/m; //動態計算每個時間間隔結束后水平方向的加速度
T-=tb; //沒運行一次,總運行時間減去時間間隔,總運行時間減至零時,結束循環
SS+=ss; //水平位移累計
x[j]=SS; //計算每個事件間隔的水平位置,存入數組,數組下標為事件單位,內容為水平坐標
j++; //數組下標加一
}
wc=SS*tan(theta_hd); //計算需向上瞄準的距離
printf("SS=%f wc=%f\n",SS,wc); //輸出水平射程,向上瞄準的距離
if((fp = fopen("/storage/emulated/0/myprogram/text.txt","w")) == NULL)
{
perror("fail to write!");
exit (1) ;
}
for(k=0;k
{
fprintf(fp,"x[%d]=%f,y[%d]=%f \n",k,x[k],k,y[k]);
}
fclose(fp);
SDL_Rect rect;
SDL_Init(SDL_INIT_EVERYTHING);
win=SDL_CreateWindow("SDL2 DRAW",0,0,1080,1920,1);
render=SDL_CreateRenderer(win,-1,NULL);
SDL_RenderClear(render);
SDL_SetRenderDrawColor(render,0,255,0,255);
for(k=0;k
{
//SDL_RenderDrawPoint(render,10*y[k],10*x[k]); //利用SDL中的繪點函數繪制曲線
//繪點函數繪出的曲線太細,為了加粗曲線,以點為中心繪制矩形。
rect = {10*y[k]+3,10*x[k]-3,7,7}; //定義矩形的頂點坐標,矩形的長、寬
SDL_RenderDrawRect(render, &rect); //繪制矩形
SDL_RenderFillRect(render, &rect); //填充矩形
}
SDL_RenderPresent(render);
SDL_Delay(50000);
return 0;
}
總結
以上是生活随笔為你收集整理的C语言编码小球斜抛运动,利用C4droid绘制小球斜抛运动轨迹(考虑空气阻力)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奥鹏C语言专科在线作业答案,奥鹏13春电
- 下一篇: c语言小学生加法考试题程序4,c语言编程