c语言编程边界处理,折叠法解决问题 (C语言代码)

参考 学明 的代码,他的判定方法看不太懂

解题思路:由于完全弹性碰撞,每次碰撞边界之后,小球只改变了速度方向,其他并没有改变。因此已知速度、入射角、时间之后,小球在X、Y轴上行走的总路程是确定的,且X、Y轴独立互不干扰。

所以可以先考虑在X轴上小球的运动,再推广到Y轴上即可。

判定方法:球心在X轴上的移动范围为[R,L-R], 先计算出在X方向的运动总路程vx*s(带方向),并将球心运动后坐标计算得dx=x+vx*s,dx分为三种情况考虑:

dx>L-R,此时球碰撞到右边界,运动方向改变,剩余运动路程为dx-(L-R),重新计算dx=(L-R)-[dx-(L-R)]即2L-2R-dx;

dx

R

Y轴判定方法同X轴。

参考代码:#include 

#include 

void hit(double L,double W, double x, double y, double R, double a, double v, double s)

{

double vx, vy;

a = a*asin(1)/90;//角度转换为弧度

vy = v*sin(a);

vx = v*cos(a);

double dx, dy;

dx = x + vx*s;

dy = y + vy*s;

while(1){

if(dx>=R&&dx<=L-R) break;

else if(dx>L-R){

dx = 2*L-2*R-dx;

}

else if(dx

dx = 2*R-dx;

}

}

while(1){

if(dy>=R&&dy<=W-R) break;

else if(dy>W-R){

dy = 2*W-2*R-dy;

}

else if(dy

dy = 2*R-dy;

}

}

printf("%.2lf %.2lf\n", dx, dy);

}

int main()

{

double L, W, x, y, R, a, v, s;

scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &L, &W, &x, &y, &R, &a, &v, &s);

while(!(L==0&&W==0&&x==0&&y==0&&R==0&&a==0&&v==0&&s==0)){

hit(L, W, x, y, R, a, v, s);

scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &L, &W, &x, &y, &R, &a, &v, &s);

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值