解题思路:
1.
将小球速度分解为x,y轴方向的分量,
vx=v*cos(a);
vy=v*sin(a);
注意c语言函数double cos(double a),里的a是弧度,而题目输入却是角度
所以先进行角度到弧度的转换:
a2=a*acos(-1)/180; 其中acos(-1)求得的是PI的精确值;
2.
小球活动范围为x轴:0+R 到 L-R
求得小球在x轴方向移动的距离Lx=vx*s,为了方便实现步骤3,对这个移动距离做一点变换
如果Lx为正,则将它加上x0,求得相对于坐标原点的正距离:dx=Lx+x0
如果Lx为负,则求出小球相对于球桌右边界的负距离:dx=Lx+x0-(L-R);
3.易错点(我改了三次)
通过一个循环控制dx在[R,L-R]之间进行折叠,直到dx在球桌范围内
while
{
if(R<=dx&&dx<=L-R) break;
if(dx>L-R) dx=-(dx-L+R); //小球在x轴正方向撞到右边界,折回,将dx变为负值,此时小球x坐标位置为L-R
if(dx<0) //dx小于0有两种情况,一种撞不到左边界,一种则撞到了
{
if(dx<R-(L-R)) dx=-(dx+(L-2*R))+R; //小球碰到左边界,折回,将dx变为正值,此时小球坐标位置为R
//值得注意的是这里变为正值之后加上R,为对应步骤2中的变换。
else dx=L-R+dx;
}
}
y轴方向同理
注意事项:
参考代码:
#include<stdio.h>
#include<math.h>
#define TRUE 1
int main()
{
double L,W,x0,y0,R,a,v,s;
double vx,vy,a1,dx,dy,Lx,Ly;
while(TRUE)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&L,&W,&x0,&y0,&R,&a,&v,&s);
if(L==0&&W==0&&x0==0&&y0==0&&R==0&&a==0&&v==0&&s==0) break;
a1=a*acos(-1)/180;
vx=v*cos(a1);
vy=v*sin(a1);
Lx=vx*s;
Ly=vy*s;
if(Lx>=0) dx=Lx+x0;
else dx=Lx+x0-(L-R);
if(Ly>=0) dy=Ly+y0;
else dy=Ly+y0-(W-R);
// printf("%.2f %.2f %.2f %.2f\n",vx,vy,dx,dy);
while(TRUE)
{
if(R<=dx&&dx<=L-R) break;
if(dx>L-R) dx=-(dx-L+R); //小球在x轴正方向撞到右边界,折回,将dx变为负值,此时小球x坐标位置为L-R
if(dx<0) //dx小于0有两种情况,一种撞不到左边界,一种则撞到了
{
if(dx<R-(L-R)) dx=-(dx+(L-2*R))+R; //小球碰到左边界,折回,将dx变为正值,此时小球坐标位置为R
//值得注意的是这里变为正值之后加上R,为对应步骤2中的变换。
else dx=L-R+dx;
}
}
while(TRUE)
{
if(R<=dy&&dy<=W-R) break;
if(dy>W-R) dy=-(dy-W+R);
if(dy<0)
{
if(dy<R-(W-R)) dy=-(dy+(W-2*R))+R;
else dy=W-R+dy;
}
}
printf("%.2f %.2f\n",dx,dy);
}
return 0;
}
0.0分
0 人评分
DNA (C语言描述,数据结构)浏览:909 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:769 |
2003年秋浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:638 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:2121 |
最小公倍数 (C语言代码)浏览:1109 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:569 |
1014题解浏览:524 |
【亲和数】 (C语言代码)浏览:628 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:676 |
循环入门练习6 (C语言代码)浏览:1058 |