• 台球碰撞


    在平面直角坐标系下,台球桌是一个左下角在(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)。x和y应四舍五入保留两位小数。
    
    样例输入
    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

    分析:高中时候的运动分解,我想我已经还给老师了,


    大致懂了,先贴代码:
    //起点 A 终点 B  与长方形边界交点C 
    #include <stdio.h>
    #include <math.h>
     
    int    n = 0;
    double    X1, Y1, x, y, R;
     
    void endpoint( double L, double W ); /* x,y is start point  X1,Y1 is end point */
     
     
    int main()
     
    {
        double L, W, a, v, s;
     
        scanf( "%lf%lf%lf%lf%lf%lf%lf%lf", &L, &W, &x, &y, &R, &a, &v, &s );
     
     
        while ( L != 0 && W != 0 && x != 0 && y != 0 && R != 0 && a != 0 && v != 0 && s != 0 )
        {
            a    = a * asin( 1 ) * 2 / 180;
            //初始结束点X Y 
            X1    = x + s*v*cos( a );
            Y1 = y + s*v*sin( a );
     
     
            while ( X1<0 || X1>L || Y1<0 || Y1>W )//判断是否出界,出界一直循环 
            {
                endpoint( L - R, W - R );
            }
            if ( X1 >= 0 + R && X1 <= L && Y1 >= 0 + R && Y1 <= W )
            {
                printf( "%.2lf %.2lf
    ", X1, Y1 );
            }
            scanf( "%lf%lf%lf%lf%lf%lf%lf%lf", &L, &W, &x, &y, &R, &a, &v, &s );
        }
     
     
    /*for(int i=0;i<n;i++)
     * {
     * printf("%.2lf %.2lf
    ",xx[i],yy[i]);
     *
     * }*/
     
        return(0);
    }
     
     
    void endpoint( double L, double W )//边界已经减去R 减去的仅仅是上右两个方向的,其他方向没变 
    {
        double upx, downx, righty, lefty, slope;
        slope = (Y1 - y) / (X1 - x);//tan# 
     
        upx    = (W - y) / slope + x;//x++ 
        downx    = (0.0 + R - y) / slope + x;//x--
     
        righty    = slope * (L - x) + y;//y++
        lefty    = slope * (0.0 + R - x) + y;//y-- 
     
        if ( Y1 > W && y < W && upx >= 0 + R && upx <= L )//   与上边相交 Y1>W  
        {
            x    = upx;//往上去 
            y    = W;
     
            Y1 = Y1 - 2 * (Y1 - W);
     
            return;
        }  /* yu shangbianjie xiang jiao */
        else
        if ( Y1 < 0 + R && y > 0 + R && downx >= 0 + R && downx <= L )//   与下边相交 
        {
            x    = downx;//往下去 
            y    = 0 + R;
     
            Y1 = Y1 - 2 * (Y1 - R);
     
            return;
        } /* yu xiabianjie */
        else
     
        if ( X1 > L && x < L && righty >= 0 + R && righty <= W )// 与右边相交 
        {
            x    = L;
            y    = righty;//y往右去 
     
            X1 = X1 - 2 * (X1 - L);
     
            return;
        } /* YU YOU BIANJIE */
        else
        if ( X1 < 0 + R && x > 0 + R && lefty >= 0 + R && lefty <= W )// 与左边相交 
        {
            x    = 0 + R;
            y    = lefty;// y往左去 
     
            X1 = X1 - 2 * (X1 - R);
     
     
            return;
        }
     
        return;
    }
    View Code
  • 相关阅读:
    系统的访问
    tomcat 和 数据库的连接
    实体类编写规则
    webmagic 爬虫
    docker安装官方Redis镜像并启用密码认证
    解决Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. 问题
    Springboot配置druid报错Failed to bind properties under 'spring.datasource' to javax.sql.DataSource
    阿里云centos7.6搭建SVN远程仓库和Git远程仓库
    java 三大特性封装继承多态
    使用easyui tab需要注意的问题
  • 原文地址:https://www.cnblogs.com/helloworld2019/p/10438355.html
Copyright © 2020-2023  润新知