#P3944. Spherical Mirrors
Spherical Mirrors
描述
在遥远的星系中,有个不同半径的球体。这些球体都是镜面,即它们有反射表面...
你站在星系的原点,向方向发射一束激光。光线沿直线传播。
当从点发出的激光在点击中球体表面时,设是连接球心和点的直线上位于球体外的一点。反射光线沿朝向点的方向传播,满足以下条件:(1)在由点、和形成的平面上;(2)角=角,如图6所示。
在经过多次反射后,光线最终超出了我们的观察范围。你的任务是编写一个程序,确定最后一次反射的点。
输入
输入由多个数据集组成,每个数据集的格式如下:
.
.
.
数据集的第一行包含一个正整数,表示球体的数量。下一行包含三个用空格分隔的整数、和,其中是从原点发射的激光的初始方向。
接下来的行中,每行包含四个用空格分隔的整数。第行对应第个球体,这些数字表示球心位置和半径。
、、、、、、和满足以下条件:
你可以假设任意两个球体表面之间的距离不小于0.1。你也可以假设原点位于任何球体之外,并且与任何球体表面的距离至少为0.1。
已知光线会在球体表面反射至少一次,最多五次。你可以假设光线与连接球心和反射点的直线之间的夹角(即图6中的)对于每个反射点都小于85度。
最后一个数据集后面是一行包含单个零的行。
输出
对于输入中的每个数据集,你应该在一行中打印最后一次反射点的、和坐标,用空格分隔。输出行中不应包含额外的字符。
输出中的坐标值误差不应大于0.01。
输入数据 1
3
-20 -20 -24
100 100 100 30
10 8 3 5
-70 -70 -84 5
4
0 47 84
-23 41 42 8
45 -10 14 19
-5 28 47 12
-27 68 34 14
0
输出数据 1
79.0940 79.0940 94.9128
-21.8647 54.9770 34.1761