学明


私信TA

用户名:17730129962

访问量:1997

签 名:

等  级
排  名 5865
经  验 1487
参赛次数 1
文章发表 2
年  龄 0
在职情况 学生
学  校 安师大
专  业 计算机科学与技术

  自我简介:

TA的其他文章

解题思路:

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 人评分

  评论区

  • «
  • »