팽이 돌리기

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

문제

팽이는 가장 인기 있고 전통적인 장난감 중 하나이며, 자기만의 팽이를 만드는 것도 즐거운 놀이다. 팽이를 만드는 가장 쉬운 방법 하나는 판지에서 어떤 모양을 오려 내고 그 무게중심을 관통하도록 축을 꽂는 것이다. 전문적으로 만든 팽이는 보통 3차원 모양을 갖지만, 이 문제에서는 2차원 모양만 다룬다.

팽이는 보통 원, 직사각형(2중 회전 대칭), 정삼각형(3중 회전 대칭)처럼 회전 대칭인 모양을 갖는다. 이러한 대칭성은 무게중심을 찾는 데 유용하지만, 반드시 필요한 것은 아니다. 비대칭 팽이도 축을 무게중심에 정확히 꽂으면 잘 돈다.

균일한 두께의 판지에서 팽이를 오려 내는 경로가 주어질 때, 팽이가 잘 돌도록 그 무게중심을 구하라. 또한 그 무게중심이 오려 낸 판지 조각 위에 있는지도 판정해야 한다. 만약 그렇지 않다면 축을 꽂을 수 없다.

Java 관련 주의: 제출하는 Java 프로그램은 인터페이스 java.awt.Shape를 구현하는 클래스를 사용할 수 없다(디버깅 목적으로는 사용해도 된다).

입력

입력은 여러 개의 데이터셋으로 이루어지며, 각 데이터셋은 팽이를 오려 내기 위한 반시계 방향 경로를 나타낸다. 경로는 여러 개의 명령 줄로 주어지며, 각 명령은 선분 또는 호를 지정한다.

아래 명령 설명에서 현재 위치란 다음 자르기를 시작할 위치를 말한다. 어떤 명령의 자르기를 실행하고 나면, 현재 위치는 그 자르기의 끝점으로 옮겨진다. 각 명령 이름은 줄의 첫 칸에서 시작하고, 명령과 인수는 공백으로 구분된다. 모든 인수는 정수이다.

  • start x y — 경로의 시작 위치를 지정한다. 이 명령 자체는 아무것도 자르지 않고, 현재 위치를 $(x, y)$로 설정하기만 한다.
  • line x y — 현재 위치에서 $(x, y)$까지 직선을 따라 자른다. $(x, y)$는 현재 위치와 다르다.
  • arc x y r — 현재 위치에서 $(x, y)$까지 원호를 따라 자른다. $(x, y)$는 현재 위치와 다르다. 호의 반지름은 $|r|$이다. $r$이 음수이면 원의 중심은 이 자르기 방향의 왼쪽에, 양수이면 오른쪽에 있다. $|r|$은 호의 두 끝점 사이 거리의 절반보다 크다. 그 반지름으로 시작점과 끝점을 잇는 두 호 중, 지정되는 것은 중심각이 $180$도 미만인 호이다.
  • close — 처음 시작 위치까지 직선으로 잘라 경로를 닫고 데이터셋을 끝낸다. 현재 위치가 이미 시작 위치와 같다면, 이 명령은 단지 데이터셋의 끝을 나타낸다.

데이터셋은 start 명령으로 시작하여 close 명령으로 끝난다. 입력의 끝은 end라는 단일 명령이 있는 줄로 표시된다.

한 데이터셋에는 최대 $100$개의 명령이 있고, 입력에는 최대 $100$개의 데이터셋이 있다. 모든 좌표와 반지름의 절댓값은 $100$ 이하이다. 경로는 자기 자신과 교차하거나 닿지 않으며, 경로가 (사실상 무한히 큰) 판지의 가장자리를 넘어가지 않는다고 가정해도 된다.

출력

각 데이터셋에 대해, 주어진 경로로 오려 낸 팽이의 무게중심의 $x$좌표와 $y$좌표를, 그 무게중심이 팽이 위에 있는지를 나타내는 문자 '+' 또는 '-'와 함께 한 줄에 출력하라('+'는 위에 있음, '-'는 없음). 두 좌표는 각각 소수점 아래 정확히 $5$자리로 반올림하여 출력하고, 두 좌표 사이 그리고 $y$좌표와 '+'/'-' 문자 사이에는 공백을 하나 둔다. 그 밖의 문자는 출력하지 않는다. 무게중심은 정확히 계산되며, 테스트 데이터는 무게중심이 경로에서 $10^{-3}$ 이상 떨어져 있어 ('+'/'-' 판정이 명확하도록) 출력하는 두 좌표 모두 $5$자리 반올림 경계에 놓이지 않음을 보장한다. 어떤 좌표가 반올림하여 0이 되는 경우에는 그 좌표를 0.00000으로(음의 부호 없이) 출력한다.

힌트

무게중심의 유용한 성질: 물체 $O$가 질량이 각각 $M_1, \ldots, M_n$인 부분 $O_1, \ldots, O_n$으로 분해될 때, $O$의 무게중심은

$$G = \frac{\sum_{i=1}^{n} M_i \cdot G_i}{\sum_{i=1}^{n} M_i}$$

이며, 여기서 $G_i$는 $O_i$의 무게중심을 가리키는 위치 벡터이다.

반지름이 $r$이고 중심각이 $\theta$(라디안)인 활꼴(현과 호로 둘러싸인 부분)은 호의 길이가 $s = r\theta$, 현의 길이가 $c = r\sqrt{2 - 2\cos\theta}$이다. 그 넓이는 $A = r^2(\theta - \sin\theta)/2$이고, 무게중심은 원의 중심으로부터 $\frac{2 r^3 \sin^3(\theta/2)}{3A}$만큼 떨어져 있다.