SGOI10之《水晶头骨》解题报告
   
题意分析

  本题是一道几何题,问题实际上求的是从一个定点向某个方向射出的一束光线的轨迹。

算法分析

  本题的规模很小(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)后,可得到
             
  因此下一次的出发方向为

小结

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

   

 
网站导航 | 关于曙光 | 联系我们 | 请提意见
Copyright © FuJian Sunshine Educational Info. Co.,Ltd.
福建曙光教育资讯有限公司 版权所有