многим рассказывал¹, как нарисовать «ленивый додекаэдр»: взять куб и поделить каждую грань пополам регулярным образом — как раз получится 6×2=12 граней, 8+12=20 вершин (вершины куба и середины его ребер)… вся комбинаторика получается правильная
если хочется еще и правильной геометрии — нужно просто немного всё продеформировать, это и показано в видео
¹ и даже писал в «Квантике» — см. №9 за 2025 год
***
как такое нарисовать и не перетрудиться? начнем с вершин куба — это просто все точки с координатами ±1
from itertools import product
vertices = list(product([-1,1], repeat=3))
чтобы получить додекаэдр, надо добавить еще 12 вершин… не хочется их все писать руками, но тут есть большая группа симметрий G: можно переставлять координаты по циклу и расставлять знаки — и так все новые вершины можно получить из одной, (φ,0,1/φ)… и что еще приятнее, все грани можно получить из одной
v0 = (phi,0,psi)
vertices += [g(v0) for g in G()]
f0 = [(phi,0,-psi),(1,1,-1),(psi,phi,0),(1,1,1),(phi,0,psi)]
faces = [tuple(vertices.index(g(v)) for v in f0) for g in G()]
poly = Polyhedron(vertices, faces)
(результат действия элемента g на набор точек f0 — это просто tuple(g(v) for v in f0) — но в faces надо положить не координаты этих точек, а номера соответствующих вершин)
если в качестве phi и psi взять не (±1+√5)/2, а 1, то додекаэдр превратится в куб с дополнительными вершинами в серединах ребер — и такая деформация анимируется в manim примерно в одну строчку
приведу еще код для генерации группы G
def G():
for signs in product([-1,1], repeat=3):
for r in range(3):
yield lambda x: tuple(x[(i+r)%3]*signs[i] for i in range(3))
(а всё собранное целиком положу в комментарии — с использованием симметрии ~20 строк получилось… ну если с паузами и вращением камеры, то чуть больше)
***
видно, кстати, что в группе G всего 24 элемента, из которых 12 сохраняют ориентацию… а всего в группе I симметрий додекаэдра 12×5=60 вращений — получаем действие I⁺ на 60/12=5 элементах I⁺/G⁺, который дает изоморфизм I⁺≃A₅
конечно, то же можно сказать и более геометрически: G это как раз подгруппа симметрий додекаэдра, сохраняющих вписанный в него куб, а 5-элементное множество I⁺/G⁺ отождествляется с 5 вписанными в додекаэдр кубами («кубы Кеплера») — вот эти кубы I⁺ и переставляет