D - Ball in a Rectangle
题意:在二维平面里,给一个矩形,然后给一个圆,圆的初始坐标为x,y,半径为R
让圆沿着与x轴正方向夹角为a的方向运动t秒,速度为v,(当圆碰到边界时会反弹,反射角等于入射角),问圆运动t秒后的位置
比赛时直接根据角度的方向去分类讨论,然后改变角度,结果写了个两百多行的模拟,细节没处理好,卡死在循环里了
解法:将速度拆分成vx和vy,计算x和y方向上的路程,然后减去n个周期的路程,最后直接计算即可
代码:
#include<bits/stdc++.h> using namespace std; double pi=acos(-1); double eps=1e-6; double L,W,x,y,R,a,v,s; int main(){ while(cin>>L>>W>>x>>y>>R>>a>>v>>s){ if(!L&&!W)break; double vx=v*cos(a*pi/180),vy=v*sin(a*pi/180); double dx=fabs(vx*s),dy=fabs(vy*s); if(L!=2*R) dx-=(int)(dx/(2*(L-2*R)))*(2*(L-2*R)); else dx=0; if(W!=2*R) dy-=(int)(dy/(2*(W-2*R)))*(2*(W-2*R)); else dy=0; //cout<<dx<<' '<<dy<<endl; if(vx>0){//110 100 70 10 5 180 1 9999 if(dx>=L-2*R+L-R-x){ x=dx-(L-2*R+L-R-x)+R; }else if(dx>=L-R-x){ x=(L-R)-(dx-(L-R-x)); }else if(dx>0){ x=x+dx; } }else{ if(dx>=L-2*R+x-R){ x=(L-R)-(dx-(L-2*R+x-R)); }else if(dx>=x-R){ x=R+dx-(x-R); }else if(dx>eps){ x=x-dx; } } //cout<<vy<<endl; if(vy>0){//100 100 80 10 5 90 2 23 //cout<<W-R-x<<endl; if(dy>=W-2*R+W-R-y){ y=dy-(W-2*R+W-R-y)+R; }else if(dy>=W-R-y){ y=(W-R)-(dy-(W-R-y)); }else if(dy>eps){ y=y+dy; } }else{ if(dy>=W-2*R+y-R){ y=(W-R)-(dy-(W-2*R+y-R)); }else if(dy>y-R){ y=R+dy-(y-R); }else if(dy>0){ y=y-dy; } } printf("%.2f %.2f ",x,y); } }