Целью этой задачи является создание анимации системы цепного привода , состоящей из набора звездочек, соединенных вместе цепью .
основные требования
Ваша программа получит список звездочек , указанных в виде (x, y, radius)
триплетов. В результате чего система цепного привода состоит из этих цепных колес, соединенных друг с другом посредством замкнутой цепи тугой , проходящей через каждый из них, в порядке . Ваша цель - создать бесконечно цикличную анимацию , показывающую систему в движении. Например, учитывая вход
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
, вывод должен выглядеть примерно так
,
Система координат должна быть такой, чтобы ось x указывала вправо, а ось y была направлена вверх. Вы можете предположить, что радиусы являются четными числами, большими или равными 8 (мы увидим, почему это важно позже.) Вы также можете предположить, что есть как минимум две звездочки и что звездочки не пересекаются друг с другом. В блокахвходные данные не слишком критичны. Все примеры и тестовые случаи в этом посте используют пиксели в качестве входных единиц (поэтому, например, радиус средней звездочки на предыдущем рисунке равен 24 пикселям;) старайтесь не слишком сильно отклоняться от этих единиц. В остальной части задачи пространственные величины понимаются в тех же единицах, что и входные данные - обязательно соблюдайте правильные пропорции! В размерах продукции должны быть немного больше , чем ограничительная рамка всех звездочек, достаточно большой , так что вся система видна. В частности, абсолютные положения звездочек не должны влиять на производительность; только их относительные положения (так, например, если бы мы сместили все звездочки в приведенном выше примере на одну и ту же величину, результат останется прежним.)
Цепь должна касаться звездочек, через которые она проходит во всех точках контакта, и прямо везде. Цепь должна проходить через звездочки так, чтобы соседние сегменты цепи (то есть части цепи между двумя звездочками, которые встречаются в одной звездочке) не пересекались друг с другом.
,
Например, хотя приведенная выше левая система действительна, средняя - нет, поскольку два соседних сегмента цепи, которые проходят через нижнюю левую звездочку, пересекаются. Тем не менее, отметим , что правая система является действительным, так как две пересекающиеся сегменты цепи не являются смежными (эта система производится на другой вход , чем два других, хотя.)
Для простоты (r), вы можете предположить, что никакая звездочка не пересекает выпуклую оболочку двух соседних звездочек или выпуклую оболочку каждого из ее соседей и другого соседа. Другими словами, верхняя звездочка на приведенной ниже схеме не может пересекать какие-либо затененные области.
Цепные сегменты могут пересекать звездочки, отличные от тех, через которые они проходят (например, в последнем тестовом примере). В этом случае цепь всегда должна появляться перед звездочками.
Визуальные требования
Цепочка должна состоять из ряда звеньев переменной ширины. Ширина узкой ссылки должна составлять около 2, а ширина широкой ссылки должна составлять около 5. Длина обоих типов ссылок должна быть примерно одинаковой. периодцепи, то есть общая длина широкой / узкой пары звеньев, должна быть ближайшим к 4π числом, которое соответствует целому числу раз в длине цепочки. Например, если длина цепочки равна 1000, то ее период должен быть 12,5, что является ближайшим числом к 4π (12,566 ...), которое соответствует целому числу раз (80) в 1000. Важно, чтобы период соответствовал целому числу раз в длине цепочки, чтобы не было артефактов в точке, где цепочка оборачивается.
Звездочка радиуса R должна состоять из трех концентрических частей: центральной оси , которая должна быть окружностью с радиусом около 3; в теле звездочки в , вокруг оси, которая должна быть окружностью радиуса около R - 4,5; и ободок звездочки вокруг корпуса, который должен быть окружностью с радиусом около
R - 1,5. Обод также должен содержать зубцы звездочки , которые должны иметь ширину около 4; размер и расстояние между зубцами должны соответствовать размерам звеньев цепи, чтобы они аккуратно соприкасались.
Период зубьев звездочки, то есть расстояние между двумя последовательными зубцами вдоль окружности звездочки, должно соответствовать периоду цепи. Поскольку период составляет около 4π, а радиус звездочки гарантированно равен, период должен соответствовать размеру звездочки почти целое число раз, чтобы не было заметных артефактов в точке, где зубы звездочки обвиваются вокруг.
Вы можете использовать любую комбинацию цветов для цепи, различных частей звездочки и фона, если они легко различимы . Фон может быть прозрачным. Примеры в этом посте используют #202020
для цепи, #868481
для оси и обода #646361
звездочки , а также для тела звездочки.
Требования к анимации
Первая звездочка в списке ввода должен вращаться по часовой стрелке ; остальные звездочки должны вращаться соответственно. Цепь должна двигаться со скоростью около 16π (около 50) единиц в секунду; частота кадров зависит от вас, но анимация должна выглядеть достаточно плавно.
Анимация должна проходить без проблем .
Соответствие
Некоторые из визуальных атрибутов и пропорций преднамеренно указаны только приблизительно - вам не нужно точно их сопоставлять . Вывод вашей программы не обязательно должен быть точной копией приведенных здесь примеров, но он должен выглядеть примерно так. В частности, точные пропорции цепи и звездочек, а также точная форма звеньев цепи и зубьев звездочки являются гибкими.
Наиболее важные моменты для подражания:
- Цепь должна проходить через звездочки в порядке ввода в правильном направлении.
- Цепь должна касаться звездочек во всех точках контакта.
- Звенья цепи и зубья звездочек должны быть аккуратно заделаны, по крайней мере, до правильного расстояния и фазы.
- Расстояние между звеньями цепи и зубьями звездочек должно быть таким, чтобы не было заметных артефактов в месте их наматывания.
- Звездочки должны вращаться в правильном направлении.
- Анимация должна проходить без проблем.
В заключение, хотя технически цель этой задачи состоит в том, чтобы написать кратчайший код, если вы хотите проявить творческий подход и создать более сложный результат, во что бы то ни стало, сделайте это!
Вызов
Напишите программу или функцию , взяв список звездочек и создав соответствующую анимацию системы цепного привода, как описано выше.
Вход и выход
Вы можете принять ввод через командную строку , через STDIN , как аргументы функции , или используя эквивалентный метод . Вы можете использовать любой удобный формат для ввода, но не забудьте указать его в своем посте.
В качестве вывода вы можете отобразить анимацию напрямую , создать файл анимации (например, анимированный GIF- файл ) или создать последовательность файлов кадров (однако в этом случае существует небольшое наказание; см. Ниже.) Если вы используете вывод файла, убедитесь, что количество кадров разумно (примеры в этом посте используют очень мало кадров;) количество кадров не должно быть минимальным, но вы не должны создавать слишком много лишних кадров. Если вы выводите последовательность кадров, обязательно укажите частоту кадров в своем посте.
Гол
Это код-гольф . Самый короткий ответ , в байтах, выигрывает.
Штраф + 10% Если ваша программа выдает последовательность кадров в качестве выходных данных, вместо непосредственного отображения анимации или создания одного файла анимации, добавьте 10% к вашему счету.
Тестовые случаи
Тест 1
(0, 0, 26), (120, 0, 26)
Тест 2
(100, 100, 60), (220, 100, 14)
Тест 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
Тест 4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
Тест 5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
Тест 6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)