D - Ball in a Rectangle

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\n",x,y);
    }

}
posted @ 2020-09-22 16:12  xuanzo  阅读(178)  评论(0编辑  收藏  举报