解题思路:只需要关注球心的运动轨迹,分为x和y两个分量分别计算,若越界(碰撞)则翻转,用一个flag表示翻转后朝向
注意事项:默认朝向为正,而sin和cos的结果可能为负,因此需要fabs()取绝对值,数据要定义为double,float会出错
参考代码:
#include<stdio.h>
#include<math.h>
#define PI 3.14159265358979323846
int main()
{
int i=0,flagx,flagy;
double x,y,Sx,Sy,px[25],py[25],L,W,R,a,v,s;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &L,&W,&x,&y,&R,&a,&v,&s);
while(L+W+R+x+y+a+v+s){
flagx=1,flagy=1; //默认初始朝正向
Sx=fabs(v*cos(a*PI/180)*s+x-R); //运动路径
Sy=fabs(v*sin(a*PI/180)*s+y-R);
while(Sx>(L-2*R)){ //越界判断
Sx-=(L-2*R); //越界后翻转
flagx*=-1; //设立标志位
}
while(Sy>(W-2*R)){
Sy-=(W-2*R);
flagy*=-1;
}
if(flagx==-1) //若最后运动方向为负
Sx=L-2*R-Sx;
if(flagy==-1)
Sy=W-2*R-Sy;
px[i]=Sx+R; //结果存入数组
py[i]=Sy+R;
i++;
if(i>24) //最多25组
break;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &L,&W,&x,&y,&R,&a,&v,&s);
}
for(int j=0;j<i;j++){
printf("%.2f %.2f\n",px[j],py[j]);
}
return 0;
}
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:1450 |
众数问题 (C语言代码)浏览:830 |
WU-陶陶摘苹果2 (C++代码)浏览:975 |
1050题解(结构体数组与结构体指针的使用)浏览:1109 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:514 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:675 |
数列有序 (C语言代码)浏览:935 |
老王赛马 (C++代码)浏览:905 |
三角形 (C语言代码)浏览:659 |
C二级辅导-求偶数和 (C语言指针动态内存法)浏览:641 |