Константа showCarcassOnly в Main.kt: Если showCarcassOnly, показываются только вершины и рёбра Иначе показываются только "передние" грани и рёбра и вершины, и принадлежащие. ! Если showCarcassOnly, фигура может быть какой угодно, иначе она обязана быть выпуклой Постоянная LIGHT_VECTOR описывает направление света. EVector(-1.R, 1.R, -2.R) предполагает свет сверху-справа-спереди Замечу, что x откладывается вправо, y вниз, а z - на зрителя. Метод нахождения цвета освещённой грани содержится в Primitives.kt/ConvexFace/enlight() Вращение описывается кватернионами - в текущем виде методика нераспространима на бoльшие измерения. В консоль можно вводить значения x, y, z (Int!) для оси. Скорость вращения постоянна. "Встроенные" фигуры хранятся в RegularPolyhedrons.kt На данный момент это куб (Cube), кубооктаэдр (Cuboctahedron) и икосаэдр (Icosahedron) Там же можно менять цвета фигур. Для описания новых фигур используется следующая методика: - Компактно описывается набор вершин. Есть методы allCombinations cirlcePermutaions allPermutations Которые принимают на вход массивы (!) чисел Real и создают векторы "пачками". Они записываются в VectorBase - Создаются вершины со ссылками на вектора из VectorBase verticesOfAllVectors Принимает на вход лист имён точек в необходимом и некоторые другие параметры, которые применяются ко всем точкам сразу. Если лист имён отсутствует, создаются неименованные вершины - Вводится длина ребра или несколько. Можно также добавлять ребра вручную, но скучно и долго. Метод edgeOfLength - Вводится количество вершин у грани. Можно несколько разных (см. кубооктаэдр). Метод faceOfVertices создаёт все найденные грани с нужным количеством вершин. Алгоритм нахождения этих граней неидеален (легко ломается, например, если попросить найти 5-угольные грани у икосаэдра - найдёт целых 12) и долго работает. Поэтому помечен @Deprecated Зато автоматически ориентирует грань правильно.