ZOJ 3015 Collision Ball Game(反射)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3015 

——训练时候的一道题,不过没什么人做,看来大家都不太喜欢计算几何= =

题目很容易理解,求小球运动的轨迹长度。如果不给定b这个题还会再有点难度,但是给了b的值就好算很多,但是也导致了不容易自己编数据。

首先这道题我想通过计算平行于x轴的l1的长度和剩下的半段l2的长度之和,算法是通过相似三角形或者直接利用tan的值,不过应该是因为精度损失严重WA了。

然后开始找损失精度小的方法,于是这才意识到为什么都知道反射角了却还要给b值,而后就想到了可以采用“入射角等于反射角”的办法找到(0,a)点关于斜边的对称点(xa,ya),最后用(xa,ya),(xa,0),(b,0)三点组成的三角形的斜边来作为这道题的答案。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define PI 3.141592653589793238462643383
const double eps=1e-6;
int main(){
    double k,h,a,b,l1,l2;
    while(cin>>k>>h>>a>>b){
        l1=2*(h-a)/(tan(k*PI/180)+1/tan(k*PI/180));
        l2=-tan(k*PI/180)*l1+2*h-a;//l2为(xa,ya)和(xa,0)的距离
        l1-=b;//l1为(xa,0)和(b,0)的距离
        double l=sqrt(l1*l1+l2*l2);
        printf("%.2lf\n",l);
    }
    return 0;
}



posted @ 2014-05-24 16:44  gaoxiang36999  阅读(201)  评论(0编辑  收藏  举报