Паперові зірки - це велика річ у моїй родині на Різдво, тому я думав, що віртуальна буде крутою.
Нижче зображено звичайний додекаедр (з https://en.wikipedia.org/wiki/Dodecahedron , приписаний автору, згаданому там).
Процес стелляції (вікіпедія) при застосуванні до багатогранника передбачає розширення граней, поки вони не перетинають інші грані. Таким чином, починаючи зі звичайного додекаедра, ми отримуємо такі форми:
Малий зоряний додекаедр, великий додекаедр і великий зоряний додекаедр
Зображення з http://jwilson.coe.uga.edu/emat6680fa07/thrash/asn1/stellations.html
Це три можливі зірки додекаедра (Вольфрам). Вони утворюють природний прогрес від додекаедра, до малого зоряного додекаедра, великого додекаедра і великого зоряного додекаедра, оскільки ми розширюємо грані все далі і далі.
Завдання
Ваша програма або функція повинна відображати або виводити у файл зображення одне з таких многогранників: Регулярний додекаедр, Малий зоряний додекаедр, Великий додекаедр або Великий зоряний додекаедр .
Колірна гамма повинна бути як друге зображення вище. Кожна з шести пар протилежних граней має бути одним із шести кольорів Червоного, Жовтого, Зеленого, Блакитного, Синього та Пурпурного. Ви можете використовувати кольори за замовчуванням з цими назвами у вашій мові чи його документації або використовувати кольори FF0000, FFFF00, 00FF00, 00FFFF, 0000FF та FF00FF (ви можете зменшити їх, зменшивши інтенсивність до мінімум 75%, якщо потрібно, наприклад, зменшивши значення F до C.)
Зауважте, що ми визначаємо "обличчя" як усі області в одній площині. Таким чином, на зображеннях, розташованих над передньою поверхнею, жовтий колір (а паралельна задня поверхня також буде жовтою.
Фон повинен бути чорним, сірим або білим. Краї можуть бути опущені, але повинні бути чорними, якщо намальовані.
Правила
Відображений багатогранник повинен бути шириною від 500 до 1000 пікселів (ширина визначається як максимальна відстань між будь-якими двома відображеними вершинами.)
Відображений багатогранник повинен бути в перспективній проекції (точка зору не менше 5 ширин від багатогранника) або ортографічна проекція (фактично перспективна проекція з точки зору в нескінченність).
Багатогранник повинен бути показаний з будь-якого кута. (Неприйнятно вибирати найпростіший можливий кут і робити твердо кодовану 2D форму.) Кут може бути визначений користувачем будь-яким із наступних способів:
Введення трьох кутів, що відповідають трьом обертам, від stdin, або як параметри функції або командного рядка. Це можуть бути або кути Ейлера (де перше і останнє обертання мають приблизно однакову вісь), або кути Тейт-Брайана (де є одне обертання навколо осі x, y та z) https://en.wikipedia.org/ wiki / Euler_angles (простіше кажучи, все триває так довго, що кожне обертання стосується осі x, y або z, а послідовні обертання - приблизно перпендикулярні осі.)
Користувач може обертати багатогранник з кроком не більше 10 градусів навколо осей x і y та оновлювати дисплей у будь-якому довільному кількості разів (якщо вважати вісь z перпендикулярна екрану).
Багатогранник повинен бути суцільним, а не каркасною.
Не дозволяється будувати багатогранники (я дивлюся на вас, Mathematica!)
Оцінка балів
Це кодегольф. Виграє найкоротший код у байтах.
Бонуси
Помножте бал на 0,5, якщо ви не використовуєте вбудовані для 3D-малювання.
Помножте свій бал на 0,7, якщо ви зможете відобразити всі три зірки додекаедра, обрані користувачем цілим числом 1-3, введеним з stdin, або за параметром функції або командного рядка.
Якщо ви обидва бонуси, ваш рахунок буде помножений на 0,5 * 0,7 = 0,35
Корисна інформація (джерела як нижче)
https://en.wikipedia.org/wiki/Regular_dodecahedron
https://en.wikipedia.org/wiki/Regular_icosahedron
Додекаедр має 20 вершин. 8 з них утворюють вершини куба з такими декартовими (x, y, z) координатами:
(± 1, ± 1, ± 1)
Решта 12 наступні (фі - золоте співвідношення)
(0, ± 1 / φ, ± φ)
(± 1 / φ, ± φ, 0)
(± φ, 0, ± 1 / φ)
Опуклий корпус малого зоряного додекаедра та великого додекаедра, очевидно, є правильним додекаедром. Зовнішні вершини описують ікосаедр.
Згідно з Вікіпедією, 12 вершин ікосаедра можна описати аналогічно циклічним перестановкам (0, ± 1, ± φ). Зовнішні вершини малого зірчастого додекагерона та великого додехеедра (у тому ж масштабі, що й додекаедр вище) утворюють більший ікосаедр, де координати вершин є циклічними перестановками (0, ± φ ^ 2, ± φ).
Кути між гранями для додекаедра та ікосаедра дорівнюють 2 арктану (фі) та арккосу (- (√5) / 3) відповідно.
Щоб отримати поради щодо обертання, див. Https://en.wikipedia.org/wiki/Rotation_matrix
EDIT: Помилково я допустив звичайний додекаедр, і не можу його відкликати зараз. Бонус x0.7 за малювання всіх трьох зоряних багатогранників залишається. У новорічний день я видам суму в розмірі 100 за відповідь, яка може відображати більшість із чотирьох багатогранників, з найкоротшим кодом як розривом краватки.
Polyhedrondata
заборонено, оскільки це очевидно вбудований малюнок багатогранників. Якщо у вашій відповіді не використовуються вбудовані для малювання багатогранників, а вони відповідають іншим правилам, то це прийнятно. Здається, ваш погляд на те, що зважаючи на те, що ви повинні правильно розфарбувати обличчя, все Polyhedrondata
одно це не заощадить, тому на практиці це може бути дещо довільним обмеженням. Я згоден у такій мірі, але це справедливіше для всіх, якщо я уникаю зміни правил після публікації.
dodecahedron
) заборонені. Деякі мови мають засоби для побудови 3D-моделей з такими командамиtriangle[[a,b,c],[p,q,r],[x,y,z]]
. Ці мови, як правило, мають вбудовані пристрої для обертання та відображення моделі, автоматично піклуючись про не відображення прихованих облич тощо. Такі рішення дозволяються, але бонус не залучає. Мета бонусу - дозволити мовам, які не мають цих засобів, бути конкурентоспроможними, а також залучити більш цікаві рішення.