zoukankan      html  css  js  c++  java
  • D

    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);
        }
    
    }
  • 相关阅读:
    CodeForces Gym 100935G Board Game DFS
    CodeForces 493D Vasya and Chess 简单博弈
    CodeForces Gym 100935D Enormous Carpet 快速幂取模
    CodeForces Gym 100935E Pairs
    CodeForces Gym 100935C OCR (水
    CodeForces Gym 100935B Weird Cryptography
    HDU-敌兵布阵
    HDU-Minimum Inversion Number(最小逆序数)
    七月馒头
    非常可乐
  • 原文地址:https://www.cnblogs.com/xuanzo/p/13687454.html
Copyright © 2011-2022 走看看