팽이 돌리기
시간 제한1초메모리 제한128 MB
선분과 원호로 이루어진 폐곡선으로 잘려진 판지 모양의 무게중심을 정확히 계산하고, 그 점이 도형 내부에 있는지 판정하는 문제입니다.
문제
팽이는 가장 인기 있고 전통적인 장난감 중 하나이며, 자기만의 팽이를 만드는 것도 즐거운 놀이다. 팽이를 만드는 가장 쉬운 방법 하나는 판지에서 어떤 모양을 오려 내고 그 무게중심을 관통하도록 축을 꽂는 것이다. 전문적으로 만든 팽이는 보통 3차원 모양을 갖지만, 이 문제에서는 2차원 모양만 다룬다.
팽이는 보통 원, 직사각형(2중 회전 대칭), 정삼각형(3중 회전 대칭)처럼 회전 대칭인 모양을 갖는다. 이러한 대칭성은 무게중심을 찾는 데 유용하지만, 반드시 필요한 것은 아니다. 비대칭 팽이도 축을 무게중심에 정확히 꽂으면 잘 돈다.
균일한 두께의 판지에서 팽이를 오려 내는 경로가 주어질 때, 팽이가 잘 돌도록 그 무게중심을 구하라. 또한 그 무게중심이 오려 낸 판지 조각 위에 있는지도 판정해야 한다. 만약 그렇지 않다면 축을 꽂을 수 없다.
Java 관련 주의: 제출하는 Java 프로그램은 인터페이스 java.awt.Shape를 구현하는 클래스를 사용할 수 없다(디버깅 목적으로는 사용해도 된다).
입력
입력은 여러 개의 데이터셋으로 이루어지며, 각 데이터셋은 팽이를 오려 내기 위한 반시계 방향 경로를 나타낸다. 경로는 여러 개의 명령 줄로 주어지며, 각 명령은 선분 또는 호를 지정한다.
아래 명령 설명에서 현재 위치란 다음 자르기를 시작할 위치를 말한다. 어떤 명령의 자르기를 실행하고 나면, 현재 위치는 그 자르기의 끝점으로 옮겨진다. 각 명령 이름은 줄의 첫 칸에서 시작하고, 명령과 인수는 공백으로 구분된다. 모든 인수는 정수이다.
start x y— 경로의 시작 위치를 지정한다. 이 명령 자체는 아무것도 자르지 않고, 현재 위치를 로 설정하기만 한다.line x y— 현재 위치에서 까지 직선을 따라 자른다. 는 현재 위치와 다르다.arc x y r— 현재 위치에서 까지 원호를 따라 자른다. 는 현재 위치와 다르다. 호의 반지름은 이다. 이 음수이면 원의 중심은 이 자르기 방향의 왼쪽에, 양수이면 오른쪽에 있다. 은 호의 두 끝점 사이 거리의 절반보다 크다. 그 반지름으로 시작점과 끝점을 잇는 두 호 중, 지정되는 것은 중심각이 도 미만인 호이다.close— 처음 시작 위치까지 직선으로 잘라 경로를 닫고 데이터셋을 끝낸다. 현재 위치가 이미 시작 위치와 같다면, 이 명령은 단지 데이터셋의 끝을 나타낸다.
데이터셋은 start 명령으로 시작하여 close 명령으로 끝난다. 입력의 끝은 end라는 단일 명령이 있는 줄로 표시된다.
한 데이터셋에는 최대 개의 명령이 있고, 입력에는 최대 개의 데이터셋이 있다. 모든 좌표와 반지름의 절댓값은 이하이다. 경로는 자기 자신과 교차하거나 닿지 않으며, 경로가 (사실상 무한히 큰) 판지의 가장자리를 넘어가지 않는다고 가정해도 된다.
출력
각 데이터셋에 대해, 주어진 경로로 오려 낸 팽이의 무게중심의 좌표와 좌표를, 그 무게중심이 팽이 위에 있는지를 나타내는 문자 '+' 또는 '-'와 함께 한 줄에 출력하라('+'는 위에 있음, '-'는 없음). 두 좌표는 각각 소수점 아래 정확히 자리로 반올림하여 출력하고, 두 좌표 사이 그리고 좌표와 '+'/'-' 문자 사이에는 공백을 하나 둔다. 그 밖의 문자는 출력하지 않는다. 무게중심은 정확히 계산되며, 테스트 데이터는 무게중심이 경로에서 이상 떨어져 있어 ('+'/'-' 판정이 명확하도록) 출력하는 두 좌표 모두 자리 반올림 경계에 놓이지 않음을 보장한다. 어떤 좌표가 반올림하여 0이 되는 경우에는 그 좌표를 0.00000으로(음의 부호 없이) 출력한다.
힌트
무게중심의 유용한 성질: 물체 가 질량이 각각 인 부분 으로 분해될 때, 의 무게중심은
이며, 여기서 는 의 무게중심을 가리키는 위치 벡터이다.
반지름이 이고 중심각이 (라디안)인 활꼴(현과 호로 둘러싸인 부분)은 호의 길이가 , 현의 길이가 이다. 그 넓이는 이고, 무게중심은 원의 중심으로부터 만큼 떨어져 있다.