#P3944. Spherical Mirrors

Spherical Mirrors

描述

在遥远的星系中,有NN个不同半径的球体。这些球体都是镜面,即它们有反射表面...

你站在星系的原点(0,0,0)(0, 0, 0),向方向(u,v,w)(u, v, w)发射一束激光。光线沿直线传播。

当从点II发出的激光在点QQ击中球体表面时,设NN是连接球心和点QQ的直线上位于球体外的一点。反射光线沿朝向点RR的方向传播,满足以下条件:(1)RR在由点IIQQNN形成的平面上;(2)角IQNIQN=角NQRNQR,如图6所示。

在经过多次反射后,光线最终超出了我们的观察范围。你的任务是编写一个程序,确定最后一次反射的点。

输入

输入由多个数据集组成,每个数据集的格式如下:

NN

uu vv ww

x1x_1 y1y_1 z1z_1 r1r_1

.

.

.

xNx_N yNy_N zNz_N rNr_N

数据集的第一行包含一个正整数NN,表示球体的数量。下一行包含三个用空格分隔的整数uuvvww,其中(u,v,w)(u, v, w)是从原点发射的激光的初始方向。

接下来的NN行中,每行包含四个用空格分隔的整数。第ii行对应第ii个球体,这些数字表示球心位置(xi,yi,zi)(x_i, y_i, z_i)和半径rir_i

NNuuvvwwxix_iyiy_iziz_irir_i满足以下条件:

1N1001 \leq N \leq 100

100u,v,w100-100 \leq u, v, w \leq 100

100xi,yi,zi100-100 \leq x_i, y_i, z_i \leq 100

5ri305 \leq r_i \leq 30

u2+v2+w2>0u^2 + v^2 + w^2 > 0

你可以假设任意两个球体表面之间的距离不小于0.1。你也可以假设原点(0,0,0)(0, 0, 0)位于任何球体之外,并且与任何球体表面的距离至少为0.1。

已知光线会在球体表面反射至少一次,最多五次。你可以假设光线与连接球心和反射点的直线之间的夹角(即图6中的θ\theta)对于每个反射点都小于85度。

最后一个数据集后面是一行包含单个零的行。

输出

对于输入中的每个数据集,你应该在一行中打印最后一次反射点的xxyyzz坐标,用空格分隔。输出行中不应包含额外的字符。

输出中的坐标值误差不应大于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