zoukankan      html  css  js  c++  java
  • HDU 4793 Collision --解方程

    题意: 给一个圆盘,圆心为(0,0),半径为Rm, 然后给一个圆形区域,圆心同此圆盘,半径为R(R>Rm),一枚硬币(圆形),圆心为(x,y),半径为r,一定在圆形区域外面,速度向量为(vx,vy),硬币向圆盘撞过去,碰到圆盘后会以相反方向相同速度回来(好像有点违背物理规律啊,但是题目是这样,没办法)。问硬币某一部分在圆形区域内的总时间。

    解法: 解方程,求 (x+vx*t,y+vy*t) 代入圆形区域方程是否有解,如果没解,说明硬币运动轨迹与圆形区域都不相交,答案为0

    如果有解,再看代入圆盘有没有解,如果有解,即为两个解的差值*2, 如果没解,那么就是与圆形区域相交的两个点的t的差值。

    有一个坑就是t的解可能为负,要判掉。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #define eps 1e-8
    using namespace std;
    #define N 10007
    
    int sgn(double x)
    {
        if(x > eps) return 1;
        if(x < -eps) return -1;
        return 0;
    }
    
    int main()
    {
        double Rm,R,r,x,y,vx,vy;
        while(scanf("%lf%lf%lf%lf%lf%lf%lf",&Rm,&R,&r,&x,&y,&vx,&vy)!=EOF)
        {
            double A1 = (vx*vx+vy*vy);
            double B1 = (2*vx*x+2*y*vy);
            double C1 = x*x+y*y-(R+r)*(R+r);
            double A2 = A1;
            double B2 = B1;
            double C2 = x*x+y*y-(Rm+r)*(Rm+r);
            double delta1 = B1*B1 - 4.0*A1*C1;
            double delta2 = B2*B2 - 4.0*A2*C2;
            if(sgn(delta1) <= 0)
            {
                puts("0.000");
                continue;
            }
            double J11 = (-B1 + sqrt(delta1))/(2.0*A1);
            double J12 = (-B1 - sqrt(delta1))/(2.0*A1);
            if(sgn(J12) >= 0)
            {
                if(sgn(delta2) <= 0)
                {
                    printf("%.3f
    ",fabs(J11-J12));
                    continue;
                }
                double J22 = (-B2 - sqrt(delta2))/(2.0*A2);
                printf("%.3f
    ",(J22-J12)*2.0);
            }
            else
                puts("0.000");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    一个好玩的代码生成工具
    正式决定了...
    小评几种O/R Mapping工具
    本期期刊主题:ASP.NET技术与JavaScript技巧,包括控件等
    vs.net2005单元测试的私有方法测试
    如何为一个instance配置多个监听,并且实现Client Load Balancing和Client Load Balancing
    编译告警解决记录
    SourceInsight宏开发
    map
    挖掘G13金矿让150M手机内存变成250M
  • 原文地址:https://www.cnblogs.com/whatbeg/p/4080167.html
Copyright © 2011-2022 走看看