蓝姬的巢


私信TA

用户名:xjwcharles

访问量:1959

签 名:

MBV

等  级
排  名 6136
经  验 1399
参赛次数 0
文章发表 3
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

喜欢Smashing Pumpkins的有没有



参考 学明 的代码,他的判定方法看不太懂


解题思路:由于完全弹性碰撞,每次碰撞边界之后,小球只改变了速度方向,其他并没有改变。因此已知速度、入射角、时间之后,小球在X、Y轴上行走的总路程是确定的,且X、Y轴独立互不干扰。

所以可以先考虑在X轴上小球的运动,再推广到Y轴上即可。


判定方法:球心在X轴上的移动范围为[R,L-R], 先计算出在X方向的运动总路程vx*s(带方向),并将球心运动后坐标计算得dx=x+vx*s,dx分为三种情况考虑:


  1. dx>L-R,此时球碰撞到右边界,运动方向改变,剩余运动路程为dx-(L-R),重新计算dx=(L-R)-[dx-(L-R)]即2L-2R-dx;

  2. dx<R,此时球碰撞到左边界,运动方向改变,剩余运动路程为R-dx,重新计算dx=R+(R-dx)即2R-dx;

  3. R<dx<L-R,此时球停在区域中,运动结束。


Y轴判定方法同X轴。


参考代码:

#include <stdio.h>
#include <math.h>

void hit(double L,double W, double x, double y, double R, double a, double v, double s)

{
    double vx, vy;
    a = a*asin(1)/90;//角度转换为弧度
    vy = v*sin(a);
    vx = v*cos(a);
    double dx, dy;
    dx = x + vx*s;
    dy = y + vy*s;
    
    while(1){
       
        if(dx>=R&&dx<=L-R) break;
       
        else if(dx>L-R){
            dx = 2*L-2*R-dx;
        }
       
        else if(dx<R){
            dx = 2*R-dx;
        }
    }
    while(1){
       
        if(dy>=R&&dy<=W-R) break;
       
        else if(dy>W-R){
            dy = 2*W-2*R-dy;
        }
       
        else if(dy<R){
            dy = 2*R-dy;
        }
    }
   
    printf("%.2lf %.2lf\n", dx, dy);
}

int main()

{
    double L, W, x, y, R, 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)){
    
    hit(L, W, x, y, R, a, v, s);
    scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &L, &W, &x, &y, &R, &a, &v, &s);
        
    }
    
    return 0;
}



 

0.0分

0 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区