| |
|
题意分析
本题是一道几何题,问题实际上求的是从一个定点向某个方向射出的一束光线的轨迹。
算法分析
本题的规模很小(n<=25,并且最多只要反射10次),因此在算法的实现上没有难度,只要逐个模拟就可以了,解题的关键在于轨迹的计算公式。
虽然问题要求前10次反射(如果有10次的话),但是每次反射是一个相对独立的过程,因此我们只需分析其中的一次就可以了。
假设当前光线的出发点为(x0,y0),出发方向为(vx,vy),设出发方向与x轴正方向所成的角为w,则
该光线的参数方程为
对于第i个圆 ,圆的方程为
将光线的参数方程分别带入每个圆方程,得到n个t的一元二次方程。若所有的方程均无正数解,则说明该光线不再发生反射;否则,设与第i个圆的方程有解 且 是所有解中最小的一个,则说明光线碰到圆i后发生反射,且反射点(newx,newy)(即光线与圆的交点)为

显然,反射点(newx,newy)就是下一次光线的出发点,那么下一次的出发方向应该是什么呢?易知,出发点(x0,y0)关于本次反射的法线的对称点(x0',y0')在反射光线上,令法线的方程为Ax+By+C=0,则

为了求得对称点,我们可先求入射点与其对称点连线的中点(mx,my),点(mx,my)是二元一次方程组

的解。求出(mx,my)后,可得到

因此下一次的出发方向为 。
小结
这是一道比较简单的几何题,算法本身并不存在复杂之处。解题的关键在于充分运用解析几何的知识,求得有利于计算机计算的公式,尽量减少实数误差和避免问题的复杂化。
|
|
|