구면 거울

시간 제한1초메모리 제한128 MB

요약
3차원 공간에서 레이저가 여러 구형 거울에 반사되는 과정을 시뮬레이션해 마지막 반사 지점을 구하는 문제입니다.
난이도

보통10점 중 6점

유형
기하, 시뮬레이션, 수학
정답자
아직 제출이 없습니다

문제

3차원 공간에 NN개의 구면 거울이 있다.

(0,0,0)(0,0,0)에서 (u,v,w)(u,v,w) 방향으로 레이저를 발사한다. 레이저는 항상 직선으로 나아간다.

점 II에서 발사된 레이저가 어떤 구면 거울 위의 점 QQ에서 반사된다고 하자. 이때 점 NN을, 그 구면 거울의 바깥에 있으면서 구면 거울의 중심과 QQ를 잇는 직선 위에 있는 한 점이라고 하자. 그러면 레이저는 다음 조건을 만족하는 방향 RR로 반사된다.

(1) RR은 II, QQ, NN이 만드는 평면 위에 있으며, ∠IQN=∠NQR\angle IQN = \angle NQR을 만족한다.

레이저가 마지막으로 반사되는 점의 위치를 찾는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 TT가 주어진다. 각 테스트 케이스의 첫째 줄에는 구면 거울의 개수 NN이 주어진다. 둘째 줄에는 레이저를 발사한 방향 uu, vv, ww가 공백으로 구분되어 주어진다.

다음 NN개의 줄에는 구면 거울을 설명하는 네 정수 xix_i, yiy_i, ziz_i, rir_i가 주어진다. 그 구면 거울의 중심은 (xi,yi,zi)(x_i, y_i, z_i)이고 반지름은 rir_i이다.

1≤N≤1001 \le N \le 100

−100≤u,v,w≤100-100 \le u, v, w \le 100

−100≤xi,yi,zi≤100-100 \le x_i, y_i, z_i \le 100

5≤ri≤305 \le r_i \le 30

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

두 구면 거울 사이의 거리는 적어도 0.10.1이다. 점 (0,0,0)(0,0,0)은 모든 구면 거울의 바깥에 있으며, 각 구면 거울과 적어도 0.10.1만큼 떨어져 있다.

레이저는 구면 거울에 적어도 1번, 많아야 5번 반사된다. 또한 반사각 θ\theta(즉 ∠NQR\angle NQR이며 ∠IQN\angle IQN과 같다)는 항상 85∘85^\circ보다 작다.

출력

각 테스트 케이스에 대해 마지막으로 반사되는 점의 좌표를 공백으로 구분하여 출력한다. 모든 좌표는 소수점 넷째 자리에서 반올림하여 셋째 자리까지 출력한다.

예제2

  1. 예제 1

    입력
    2
    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
    
    예상 출력
    79.094 79.094 94.913
    -21.865 54.977 34.176
    
  2. 예제 2

    입력
    1
    3
    17 -68 29
    -46 -82 -12 10
    18 -48 35 29
    -80 93 -54 29
    
    예상 출력
    7.870 -31.480 13.425