解题思路:
化为质点忽略半径,利用对称解决反弹
注意事项:
a=a*asin(1)/90//把角度转化为弧度( 没有用这个公式因为精度问题错了两遍o(╥﹏╥)o )
参考代码:
#include<stdio.h> #include<math.h> main() { double L,W,R,a,v,s,x,y; while(~scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&L,&W,&x,&y,&R,&a,&v,&s) && L!=0)//只需判断一个 L!=0 即可。 { L-=2*R; W-=2*R;//长宽减去 2R x-=R; y-=R;// X,Y 减去 R,这样就可以把球看成质点运动。 x+=v*cos(a*asin(1)/90)*s; y+=v*sin(a*asin(1)/90)*s;//速度分解为X,Y方向 * 时间 while(x<0 || x>L)// X 超出边界 { if(x>L) x=2*L-x;//X关于L对称 if(x<0) x=-x;// X 关于 0 对称 } while(y<0 || y>W)// Y 同上 { if(y>W) y=2*W-y; if(y<0) y=-y; } printf("%.2lf %.2lf\n",x+R,y+R);// 原坐标加回 R , 系统会自动四舍五入 } }
0.0分
9 人评分
我这也有一个版本,大家看看如何 #include<stdio.h> #include<math.h> #define PI 3.141592 int main() { double L,W,x,y,a,v,s,R,m,x1,y1; while(scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&L,&W,&x,&y,&R,&a,&v,&s)) { if(L==0) break; a = a * asin( 1 ) * 2 / 180; x1=x+v*s*cos(a); y1=y+v*s*sin(a); while(1) { if(x1>(L-R)) x1=2*(L-R)-x1; else if(x1<R) x1=2*R-x1; if(y1>(W-R)) y1=2*(W-R)-y1; else if(y1<R) y1=2*R-y1; if(R<=x1&&x1<=L-R&&R<=y1&&y1<=W-R) break; } printf("%.2lf %.2lf\n",x1,y1); } return 0; }
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:564 |
最长单词 (C语言代码)浏览:1371 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:579 |
C语言训练-求1+2!+3!+...+N!的和 (C语言代码)浏览:787 |
简单的a+b (C语言代码)浏览:525 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:503 |
用筛法求之N内的素数。 (C语言代码)浏览:646 |
IP判断 (C语言代码)浏览:763 |
C语言程序设计教程(第三版)课后习题6.6 (C语言代码)浏览:349 |
关于C语言变量位置的问题浏览:272 |