zoukankan      html  css  js  c++  java
  • 台球碰撞

    在直角坐标系,在左下角的一张台球桌(0,0),在右上角(L,W)矩形。

    有球体的中心(x,y)。半径R在台球桌圆形母球(在整个球台球桌)。

    接收碰撞后,沿极角为a的射线(即:x正半轴逆时针旋转到此射线的角度为a)飞出,每次碰到球桌时均发生全然弹性碰撞(球的速率不变,反射角等于入射角)。

    假设球的速率为vs个时间单位之后球心在什么地方?

    输入

    输入文件最多包括25组測试数据,每一个数据仅一行,包括8个正整数L,W,x,y,R,a,v,s(100<=L,W<=105,1<=R<=5, R<=x<=L-R, R<=y<=W-R,0<=a<360, 1<=v,s<=105)。含义见题目描写叙述。

    L=W=x=y=R=a=v=s=0表示输入结束。你的程序不应当处理这一行。

    输出

    对于每组数据,输出仅一行,包括两个实数x, y。表明球心坐标为(x,y)。xy应四舍五入保留两位小数。

    例子输入

    例子输出

    100 100 80 10 5 90 2 23

    110 100 70 10 5 180 1 9999

    0 0 0 0 0 0 0 0

    80.00 56.00

    71.00 10.00


    # include <cstdio>
    # include <cmath>
    # include <iostream>
    using namespace std;
    
    int main()
    {
        double L,W,x,y,R,a,v,s;
        while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&L,&W,&x,&y,&R,&a,&v,&s)!=EOF)
        {
            if(L==0)    break;
            //将球看成一个点;
            x-=R,y-=R,L-=2*R,W-=2*R;
            //将角度换为弧度;
            a*=acos(0.0)/90;
            //计算经过多少个来回,fmod函数求模;
            //速度分解;
            double dx = fmod(fmod(v*s*cos(a), L*2)+L*2, L*2);  //防止出现负数,所以先加上L*2;
    		double dy = fmod(fmod(v*s*sin(a), W*2)+W*2, W*2);
    		//dx,dy都是大于零的;
    		if(x+dx <= L)     x += dx;
    
    		else if(x+dx <= L*2)   x = L-(x+dx-L);
    
    		else    x = x+dx-L*2;
    
    		if(y+dy <= W)      y += dy;
    
    		else if(y+dy <= W*2)      y = W-(y+dy-W);
    
    		else    y = y+dy-W*2;
    
    		printf("%.2lf %.2lf
    ", x+R, y+R);
        }
        return 0;
    }

  • 相关阅读:
    Redis 数据类型
    python的图形化界面
    python文件操作
    持续集成(Continuous Integration)
    MySQL理解索引、添加索引的原则
    Perl中的字符串操作函数
    PHP常用函数大全
    Javascript 中 Array的 sort()和 compare()方法
    使用Composer管理PHP依赖关系
    一致性 Hash 算法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4602167.html
Copyright © 2011-2022 走看看