c语言对地面的完全弹性碰撞模拟

废话不多说直接上视频 

参考库easyx 

环境devC++

球于球之间的碰撞尚未完成,期待大佬重构。

项目16 2024-02-06 17-54-17

#include <graphics.h>
#include <math.h>
#include <time.h>
#include<stdio.h>
#include <pthread.h>
DWORD*	pBuffer;	
int  width=1000;//宽 
int height=700;//高 
int x[100];//物体的x轴 
int y[100];//物体的y轴 
int r[100];//物体的半径
int Vx[100] ;//物体的x轴速度
int Vy[100] ;//物体的y轴速度 
int ax[100];//物体的x轴加速度 
int ay[100];//物体等待y轴加速度 
int fa=1; //空气阻力 
int N=1;//当前物体数量 
int w=1200;
int h=500;
int stop=0;
int sellps_x=0;//延时因子 
MOUSEMSG msg;//鼠标事件 
void cycle();//生命周期多线程模拟
void create() ;//创建一列物体
void delup() ;//删除一列物体
void change();//改变物体轨迹  碰撞 
void setstate();//改变状态
void draw();//开始绘画物体 
void delups();
void delay(DWORD ms)
{
	static DWORD oldtime = GetTickCount();
    while(GetTickCount() - oldtime < ms)
		Sleep(1);
	oldtime = GetTickCount();
}
void create(){//创建物体 
    for(int i=0;i<N;i++) {
    	 solidcircle(x[i],y[i],r[i]) ;
	}
 }
void delup(){//删除上一个物体 
	 for(int i=0;i<N;i++) {
	 	fillcircle(x[i],y[i],r[i]);
	 }
}
void change(){//改变运动轨迹 
//计算碰撞时的初速度
//联立动量守恒和能量守恒得知v1=v2速度互换符号不变 
	 for(int i=0;i<N;i++) {//碰撞时反弹加一个加速度 
	 	for(int i1=i+1;i1<N;i++){
	 		if((y[i]+r[i])<y[i1]&&i!=i1){//y轴发生碰撞了 
	 			int V=Vy[i] ;
	 			Vy[i]=Vy[i1];
	 			Vy[i1]=V;
			 }
			 if((x[i]=r[i])<=x[i1]&&i!=i1) {//x轴发生了碰撞 
			 	int V=Vx[i] ;
	 			Vx[i]=Vx[i1];
	 			Vx[i1]=V;
			 }
		 }
	 }
}
void setstate(){//多物体运动 
	 for(int i=0;i<N;i++) {
	 	
	 	x[i]+=Vx[i];
	 	y[i]+=Vy[i];
	 	if(x[i]>=w){
	 	Vx[i]=-Vx[i];
		}
		 if(y[i]>=h){
		 	Vy[i]=-Vy[i];
		}if(x[i]<=0){
			Vx[i]=-Vx[i];
		}
	 	Vx[i]+=ax[i]-fa;
	 	Vy[i]+=ay[i]-fa;
	 }stop=2;
} 
void* pthraed_1_Code(void* arg){
	   
	    while(1){	
		msg = GetMouseMsg();
	    if(msg.uMsg==WM_LBUTTONDOWN){
			stop=1; 
	    	delups();cleardevice();
	    for(int i=0;i<N;i++) {
		  	x[i]=msg.x+rand()%100;
		    x[i]-=5;
		    y[i]=msg.y+rand()%100;
	    }
		}
		while(msg.uMsg == WM_RBUTTONDOWN){
			stop=1; 
	    cleardevice();
	    for(int i=0;i<N;i++) {
		  	x[i]=msg.x+rand()%100;
		    x[i]-=5;
		    y[i]=msg.y+rand()%100;
	    }
	    msg = GetMouseMsg();
	    if(msg.uMsg == WM_RBUTTONUP)break;
		}
		stop=0;	    
		}
	 	
}
void draw(){//绘画 
     stop=0;
	 for(int i=0;i<N;i++) {	 	
	 	setfillcolor(BLUE);
	 	fillcircle(x[i],y[i],r[i]);
	 }
}

void delups(){//开始删除 
    
	for(int i=0;i<N;i++) {
		clearcircle(x[i],y[i],r[i]+1);
	} 
}
void initialization(int n){//初始化 
     int random_number = rand();  
       srand(time(0));  
	 for(int i=0;i<n;i++){
	 	// 使用当前时间作为随机数生成器的种子  
      
        x[i]= rand()%100; 
        y[i]= rand()%100; 
        r[i]=5;
        Vx[i]=2;
        Vy[i]=2;
        ax[i]=2;
        ay[i]=2;
	 }
}
void run(){//启动 
     initialization(100);//创建100个物体 
     N=90;
     BeginBatchDraw();
	while(1)
	 	{
	 	delups() ;//删除 
	 	setstate();//改变物理量
	 	draw();//绘画 
	 	FlushBatchDraw();
	 	delay(20);//等待100ms
	 	EndBatchDraw();
		

	//	change() ;//如果发生碰撞		 
	 }
}
void* pthread_2_Code(void* arg){
	run();
}
void pthread_test(int argc,char** args){
    //创建两个线程
    pthread_t p1,p2;

    //初始化线程1(无参)
    pthread_create(&p1,NULL,pthraed_1_Code,NULL);

    //初始化线程2(有参)
    int a = 100;
    pthread_create(&p2,NULL,pthread_2_Code,&a);

    //主线程等待线程1和2执行完毕,否则可能进程1和2还未执行完毕主进程就就结束了
    pthread_join(p1,NULL);
    pthread_join(p2,NULL);
}

int main(int argc,char** args){
	initgraph(w,h);
	pthread_test(argc,args);
	getchar() ;
	return 0;
}

 

 

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值