Мета цього завдання - створити анімацію системи приводу ланцюга , що складається з набору зубчастих передач, з'єднаних між собою ланцюгом .
Загальні вимоги
Вашій програмі буде наданий список зірочок , вказаний у вигляді (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)