Вращение волчка
Волчки — это одни из самых популярных и традиционных игрушек. Не только их вращение, но и изготовление собственного волчка — популярное развлечение.
Один из самых простых способов сделать волчок — вырезать определенную форму из картона и проткнуть ось через его центр масс. Профессионально изготовленные волчки обычно имеют трехмерные формы, но в этой задаче мы рассматриваем только двумерные.
Обычно волчки имеют вращательно-симметричные формы, такие как круг, прямоугольник (с 2-кратной вращательной симметрией) или правильный треугольник (с 3-кратной симметрией). Хотя такие симметрии полезны для определения их центров масс, они не являются обязательными; асимметричный волчок также хорошо вращается, если его ось правильно проткнута в центре масс.
Когда форма волчка задана как путь для вырезания из картона равномерной толщины, ваша задача — найти его центр масс, чтобы он хорошо вращался. Также необходимо определить, находится ли центр масс на части вырезанного картона. Если нет, то, конечно, нельзя проткнуть ось.
Специфика Java: представленные программы на Java не могут использовать классы, реализующие интерфейс "java.awt.Shape". Вы можете использовать их для отладки.
Входные данные
Входные данные состоят из нескольких наборов данных, каждый из которых описывает путь против часовой стрелки на картоне для вырезания волчка. Путь указывается последовательностью командных строк, каждая из которых задает отрезок или дугу.
В описании команд ниже текущая позиция — это позиция для начала следующего разреза, если он есть. После выполнения разреза, указанного командой, текущая позиция перемещается в конечную позицию сделанного разреза.
Данные команды являются одной из перечисленных ниже. Имя команды начинается с первого столбца строки, и команда и ее аргументы разделяются пробелом. Все аргументы команд — целые числа.
start x y
Задает начальную позицию пути. Эта команда сама по себе не задает никакого разреза; она только устанавливает текущую позицию в (x, y).
line x y
Задает линейный разрез вдоль прямой линии от текущей позиции до позиции (x, y), которая не совпадает с текущей позицией.
arc x y r
Задает круговой разрез вдоль дуги окружности. Дуга начинается с текущей позиции и заканчивается в (x, y), которая не совпадает с текущей позицией. Дуга имеет радиус |r|. Когда r отрицателен, центр окружности находится слева от направления этого кругового разреза; когда он положителен, он находится справа (Рисунок 1). Абсолютное значение r больше половины расстояния между двумя концами дуги. Среди двух дуг, соединяющих начальную и конечную позиции с заданным радиусом, задана та, у которой центральный угол меньше 180 градусов.
close
Закрывает путь, делая линейный разрез до начальной стартовой позиции и завершает набор данных. Если текущая позиция уже находится в стартовой позиции, эта команда просто указывает конец набора данных.
На рисунке ниже приведен пример последовательности команд и соответствующего пути. Обратите внимание, что в этом случае заданный радиус −r отрицателен, и поэтому центр дуги находится слева от дуги. Команда дуги должна интерпретироваться, как показано на этом рисунке, а не наоборот на той же окружности.
Рисунок 1: Частичная последовательность команд и указанный путь
Набор данных начинается с команды start и заканчивается командой close.
Конец ввода указывается строкой с командой end.
В наборе данных не более 100 команд, и во входных данных не более 100 наборов данных. Абсолютные значения всех координат и радиусов не превышают 100.
Вы можете предположить, что путь не пересекает и не касается сам себя. Вы также можете предположить, что пути никогда не выходят за пределы краев картона, или, другими словами, картон виртуально бесконечно большой.
Выходные данные
Для каждого набора данных выведите строку, содержащую x- и y-координаты центра масс волчка, вырезанного указанным путем, а затем символ '+' или '-', указывающий, находится ли этот центр на волчке или нет, соответственно. Две координаты должны быть в десятичных дробях. Между двумя координатами и между y-координатой и символом '+' или '-' должен быть пробел. Не следует выводить никаких других символов. Координаты могут иметь ошибки менее 10^{−3}. Вы можете предположить, что центр масс находится на расстоянии не менее 10^{−3} от пути.
Подсказки
Важное свойство центров масс заключается в том, что, когда объект O может быть разложен на части O_1, ..., O_n с массами M_1, ..., M_n, центр масс O можно вычислить по формуле:
где G_k — вектор, указывающий центр масс O_k.
Круговой сегмент с радиусом r и углом θ (в радианах) имеет длину дуги s = rθ и длину хорды . Его площадь A = r^2(θ − sinθ)/2, а его центр масс G находится на расстоянии y = 2r^3 sin^3(θ/2)/(3A) от центра окружности.
Рисунок 2: Круговой сегмент и его центр масс
Рисунок 3: Первый пример волчка