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);
        }
    
    }
  • 相关阅读:
    Git远程和分支管理
    Git基本使用教程
    linux基础知识总结
    正则表达式-概要
    java注释规范
    JavaScript对象(Object)
    centos7安装docker
    springboot项目问题记录one
    tomcat不需要重启热部署xml文件
    java调用新浪接口根据Ip查询所属地区
  • 原文地址:https://www.cnblogs.com/xuanzo/p/13687454.html
Copyright © 2011-2022 走看看