日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言编码小球斜抛运动,利用C4droid绘制小球斜抛运动轨迹(考虑空气阻力)

發布時間:2025/4/16 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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绘制小球斜抛运动轨迹(考虑空气阻力)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。