题意:空间中有n个球,一条光线遇到球会发生反射,问这条光线都遇到了哪些球。
思路:这题坑了一天终于过了,太感人了。发现高中学的向量的知识都快忘光了……这题n不大,所以可以直接枚举每个球,看光线是否会遇到球,然后取最近的,圆与射线的交点可以表示成起点加上k倍的终点和起点的差,把这个点代入圆的公式就得到一个一元二次方程,求出k以后就可以求出交点了,需要注意的是k不能为负。剩下的就是求反射以后的射线,设起点到交点的向量为A,交点到圆心的向量为B,那么反射后的向量为:用A在B上做投影,然后与B合成一个向量,把这个向量乘2,然后用A减这个向量就是结果。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
const int maxn=55;
struct Point
{
double x,y,z;
Point (){};
Point (double xx,double yy