探测器在球形护盾内部做匀速直线运动,其坐标随时间变化满足:
x=x0+uxt,y=y0+uyt,z=z0+uzt当探测器首次触及球形护盾边界时,其位置落在球面上,即满足球面方程:
在一个以原点为中心、半径为 R 的球形能量护盾内部,有一艘微型探测器。探测器的初始位置为 (x0,y0,z0),并且以恒定速度 (ux,uy,uz) 直线飞行。当探测器到达护盾球面时,会触发警报。请计算从初始时刻起,探测器首次触及球形护盾边界的时间。
将运动方程 x=x0+uxt,y=y0+uyt,z=z0+uzt 代入球面方程 x2+y2+z2=R2,得到关于时间 t 的一元二次方程 at2+bt+c=0,其中: a=ux2+uy2+uz2, b=2(x0ux+y0uy+z0uz), c=x02+y02+z02−R2。 数据保证初始时刻探测器在球形护盾内部(含球面),即 c≤0,且速度向量不为零,因此 a>0。该方程必定存在一个非负实根,所求的最早触及时刻即为较大的那个根: t=2a−b+b2−4ac。
约束条件:测试数据组数 t 不超过 1000。每组数据中的初始坐标、速度分量以及半径的绝对值均不超过 103。输入保证初始位置在球面内(包含球面),且速度向量非零向量。
第一行包含一个整数 t,表示测试数据的组数。 接下来 t 行,每行包含七个实数,依次为:初始坐标 x0, y0, z0,速度分量 ux, uy, uz 以及球形护盾的半径 R。数字之间以空格分隔。
输出共 t 行,每行一个实数,表示探测器首次触及球形护盾的最早非负时刻。每个答案保留到小数点后 10 位,绝对误差或相对误差在 10−5 范围内即视为正确。
输入
1
3 4 0 1 0 0 5
输出
0.0000000000
说明
初始位置 (3,4,0) 满足 32+42+02=25=R2,探测器已经在球形护盾的边界上。根据题意,此时警报立即触发,因此最早非负时刻为 0。代入方程得 a=1, b=6, c=0,较大的根 t=0,与结论一致。
输入
1
0 0 0 0 0 5 10
输出
2.0000000000
说明
探测器从原点 (0,0,0) 以速度 (0,0,5) 沿 z 轴正方向飞行,护盾半径 R=10。运动方程代入球面方程得 25t2−100=0,系数 a=25, b=0, c=−100。判别式 b2−4ac=100,较大的根 t=100/(2×25)=2。故首次触及时刻为 2.0000000000。
输入
2
2 3 6 1 0 0 7
0 0 0 1 2 2 3
输出
0.0000000000
1.0000000000
说明
第一组数据:初始位置 (2,3,6) 满足 22+32+62=49=72,已在球面上,t=0。第二组数据:从原点出发,速度向量 (1,2,2) 的模长为 12+22+22=3,半径 R=3。代入公式得 a=9, b=0, c=−9,判别式开方得 18,t=18/(2×9)=1。两组输出分别为 0.0000000000 和 1.0000000000。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.