Геометрия
Многогранники
Каждая 3D модель в игре, фильме или 3D-принтере-это mesh из вершин, рёбер и граней. Формула Эйлера гарантирует корректность топологии; Half-Edge-структура, на которой работают Blender, Maya и все современные DCC-инструменты.
- **3D игры:** ico-sphere, cube subdivision-стандартные примитивы на основе платоновых тел
- **Collision detection:** GJK algorithm работает с выпуклыми оболочками объектов
- **3D-печать slicing:** mesh обрабатывается через Half-Edge структуру для нахождения контуров срезов
- **Computational geometry:** scipy.spatial.ConvexHull-QuickHull под капотом
Предварительные знания
Формула Эйлера
Формула Эйлера-топологический инвариант для выпуклых многогранников, связывающий число вершин, рёбер и граней.
**Формула Эйлера:** V − E + F = 2 где V-вершины, E-рёбра, F-грани. Пример: куб: V=8, E=12, F=6 → 8−12+6 = 2 ✓ **Обобщение (характеристика Эйлера):** χ = V − E + F = 2 − 2g, где g-род поверхности (число "ручек").
Многогранник имеет 10 вершин и 15 рёбер. Сколько граней у него по формуле Эйлера?
Платоновы тела
Платоновы тела-пять правильных выпуклых многогранников, у которых все грани-одинаковые правильные многоугольники. Доказано, что других не существует.
| Тело | V | E | F | Грань | Применение в CS |
|---|---|---|---|---|---|
| Тетраэдр | 4 | 6 | 4 | Треугольник | Минимальный mesh примитив |
| Куб | 8 | 12 | 6 | Квадрат | Voxels, AABB коллизии |
| Октаэдр | 6 | 12 | 8 | Треугольник | Bounding octahedron |
| Додекаэдр | 20 | 30 | 12 | Пятиугольник | Геодезические купола |
| Икосаэдр | 12 | 30 | 20 | Треугольник | Subdiv sphere (game meshes) |
Sphere mesh в играх создают из икосаэдра путём subdivision: каждый треугольник делится на 4, новые вершины проецируются на сферу. Это даёт равномерное распределение точек.
Какое платоново тело используют как базу для генерации sphere mesh в 3D движках?
Выпуклая оболочка
Выпуклая оболочка множества точек-наименьший выпуклый многогранник, содержащий все эти точки. Это базовая структура для collision detection и пространственных запросов.
**Алгоритмы в 3D:** - **Gift Wrapping (Jarvis):** O(nF), F-число граней. Прост в реализации. - **QuickHull:** O(n log n) в среднем-наиболее практичен. - **Incremental:** O(n log n)-добавляем точки по одной. **GJK (Gilbert-Johnson-Keerthi):** определяет пересечение двух выпуклых тел без явного построения оболочки.
Какова сложность алгоритма QuickHull для n точек в среднем случае?
Half-Edge структура данных
Half-Edge-стандартная структура данных для 3D mesh, позволяющая эффективно обходить соседние элементы (вершины, рёбра, грани) за O(1).
**Half-Edge:** каждое ребро делится на 2 "полурёбра" с противоположными направлениями. Каждый half-edge хранит: - `vertex`-вершина в начале - `face`-грань слева - `next`-следующий half-edge вдоль грани - `twin`-противоположное полуребро
Какова сложность нахождения всех соседних вершин для заданной вершины в Half-Edge структуре?
Ключевые идеи
- **Эйлер:** V−E+F=2 для любого выпуклого многогранника-топологический инвариант
- **Платоновы тела:** ровно 5; икосаэдр-основа sphere mesh в 3D движках
- **Convex Hull:** QuickHull O(n log n)-базовый алгоритм пространственного поиска
- **Half-Edge:** локальный обход mesh за O(k)-стандарт 3D DCC и CAD инструментов
Связанные темы
Многогранники-основа для тел вращения и вычислительной геометрии:
- Тела вращения — Сфера-предел икосаэдра при бесконечном subdivision
- Векторная геометрия — Нормали граней = векторные произведения рёбер
- Геометрия в CS — Convex hull-ключевой алгоритм вычислительной геометрии
Вопросы для размышления
- Докажите, что не существует правильного многогранника с шестиугольными гранями, используя формулу Эйлера.
- Почему GJK algorithm работает только с выпуклыми оболочками? Как обрабатывают невыпуклые объекты?
- В чём преимущество Half-Edge перед простым хранением списков вершин и граней (face-vertex mesh)?