로봇 팔 역기구학

모든 관절 각도가 같은 로봇 팔에서 각 세그먼트 길이와 손끝 좌표가 주어질 때, 목표에 도달하는 기본 각도와 관절 각도를 구한다.

보통6기하이분 탐색완전 탐색아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

로봇 팔을 움직이는 일은 보기보다 까다롭다. 팔이 마디 여러 개로 이루어져 있으면 관절마다의 각도가 모여서 손끝의 위치를 정한다. 산업용 로봇에서는 작업자가 손끝의 목표 위치만 지정하고 관절 각도는 소프트웨어가 계산한다. 이 계산을 역기구학이라고 부른다.

여기서 다루는 팔은 마디 NN개로 이루어지고, 밑동에서부터 1번부터 NN번까지 번호를 붙인다. 밑동은 원점에 고정되어 있고 1번 마디는 어느 방향으로든 향할 수 있다. 이웃한 두 마디 사이의 관절은 모두 같은 각도로 고정된다.

밑동 각도를 θ\theta, 공통 관절 각도를 φ\varphi라 하고 둘 다 도 단위로 잰다. 1번 마디는 xx축 양의 방향에서 반시계 방향으로 θ\theta만큼 돌린 방향을 향한다. kk번 마디와 k+1k+1번 마디 사이의 관절에서는, kk번 마디를 거슬러 가리키는 방향에서 반시계 방향으로 φ\varphi만큼 돌린 방향이 k+1k+1번 마디의 방향이 된다. φ\varphi가 180이면 팔은 곧게 펴지고, 그보다 작으면 관절마다 같은 크기로 시계 방향으로 꺾인다. 따라서 kk번 마디의 방향은

θ(k1)(180φ)\theta - (k-1)(180 - \varphi)

이고, NN번 마디 끝에 있는 손끝의 위치는

(k=1Nkcos(θ(k1)(180φ)),  k=1Nksin(θ(k1)(180φ)))\left(\sum_{k=1}^{N} \ell_k \cos\big(\theta - (k-1)(180-\varphi)\big),\; \sum_{k=1}^{N} \ell_k \sin\big(\theta - (k-1)(180-\varphi)\big)\right)

이다. 여기서 k\ell_kkk번 마디의 길이다.

그림에서 팔은 (0,0)(0, 0)에 고정되어 있고 마디 길이는 차례로 1, 3, 1이다. 밑동 각도와 공통 관절 각도가 모두 90도여서 손끝이 (3,0)(3, 0)에 놓인다.

마디 길이와 손끝의 위치가 주어지면 θ\thetaφ\varphi를 구하여라.

손끝을 같은 점에 놓는 (θ,φ)(\theta, \varphi) 쌍이 여럿 있을 수 있다. 그중 공통 관절 각도 φ\varphi가 가장 큰 쌍, 즉 목표에 닿는 팔 가운데 가장 덜 꺾인 것을 답으로 삼는다.

입력

입력은 문제 여러 개로 이루어지고 문제 수는 20개 이하이다. 각 문제의 첫 줄에는 NN, XX, YY가 공백으로 구분되어 주어진다. NN은 마디 수이고 2N302 \le N \le 30이다. XXYY는 손끝이 놓여야 할 좌표이며 실수로 주어진다. 이어지는 NN개의 줄에는 밑동부터 차례로 각 마디의 길이가 한 줄에 하나씩 실수로 주어진다. 0 세 개로 이루어진 줄이 나오면 입력이 끝나고, 그 줄은 문제가 아니다.

모든 마디 길이는 1 이상 10 이하이고, 좌표는 10X10-10 \le X \le 10, 10Y10-10 \le Y \le 10을 만족한다. 손끝이 원점에 놓이는 경우는 없다. 모든 문제에는 답이 적어도 하나 있고, 소수점 셋째 자리가 반올림 경계에 걸리는 답은 입력에 나오지 않는다.

출력

문제마다 한 줄에 두 값을 공백으로 구분해 출력한다. 앞은 밑동 각도, 뒤는 공통 관절 각도이며 둘 다 도 단위로 소수점 아래 셋째 자리까지 정확히 출력한다. 목표에 닿는 각도 쌍이 여럿이면 공통 관절 각도가 가장 큰 쌍을 출력한다. 밑동 각도는 0 이상 360 미만이고, 공통 관절 각도는 0 이상 180 이하이다.