Звезды из бумаги - большая вещь в моей семье на Рождество, поэтому я подумал, что виртуальная звезда будет крутой.
Ниже приведено изображение обычного додекаэдра (из 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-форму.) Угол может быть задан пользователем одним из следующих способов:
Ввод трех углов, соответствующих трем поворотам, от стандартного ввода или в качестве параметров функции или командной строки. Это могут быть либо углы Эйлера (где первое и последнее вращение вокруг одной и той же оси), либо углы Тейта-Брайана (где по одному повороту вокруг оси 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, введенным из стандартного ввода, или параметром функции или командной строки.
Если вы выберете оба бонуса, ваш счет будет умножен на 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.
РЕДАКТИРОВАТЬ: по ошибке я допустил обычный додекаэдр, и не могу сейчас его отозвать. Бонус х0,7 за рисование всех трех звездчатых многогранников остается. В Новый год я выдам вознаграждение в 100 за ответ, который может отображать большинство из четырех многогранников с кратчайшим кодом в качестве разрыва связи.
Polyhedrondata
не допускается, так как он явно является встроенным для рисования многогранников. Если ваш ответ не использует встроенные функции для рисования многогранников и соответствует другим правилам, тогда это приемлемо. Похоже, ваша точка зрения заключается в том, что, учитывая тот факт, что вы должны правильно окрашивать лица, Polyhedrondata
это не сильно вас спасет, поэтому на практике это может быть несколько произвольным ограничением. Я согласен в некоторой степени, но это справедливее для всех, если я не буду менять правила после публикации.
dodecahedron
) запрещены. В некоторых языках есть средства для создания 3D-моделей с такими командами, какtriangle[[a,b,c],[p,q,r],[x,y,z]]
. Эти языки обычно имеют встроенные функции для вращения и отображения модели, автоматически заботящиеся о том, чтобы не отображать скрытые лица и т. Д. Решения, подобные этим, разрешены, но не будут привлекать бонус. Цель бонуса - позволить языкам, не имеющим этих возможностей, быть конкурентоспособными, а также привлекать более интересные решения.