3622
правки
Изменения
→Алгоритм с изпользованием SLAV
== Алгоритм с изпользованием SLAV ==
Далее будет описан алгоритм, придуманный Petr Felkel, который строит <tex> \mathrm{straight}\ \mathrm{skeleton} </tex> за время <tex> \mathcal{O}(n^2 \log n)</tex>, где <tex> n </tex> {{---}} общее число вершин в полигоне. В оригинальной статье этому алгоритму даётся асимптотическая оценка <tex> \mathcal{O}(nm + n \log n)</tex>, или просто <tex> \mathcal{O}(n^2)</tex>, где <tex> n m </tex> {{---}} общее число невыпуклых вершин в полигоне, . Однако в статье содержатся ошибки. Модифицированный и исправленный Fernando Cacciola<texref> m [https://www.cgal.org/UserWorkshop/2004/straight_skeleton.pdf Fernando Cacciola, "A CGAL implementation of the Straight Skeleton of a Simple 2D Polygon with Holes "]</texref> {{---}} число вогнутых вершин в полигоне. Немного модифицированный этот алгоритм используется в открытой библиотеке вычислительной геометрии CGAL<ref>[http://doc.cgal.org/latest/Straight_skeleton_2/index.html CGAL 4.5 {{---}} 2D Straight Skeleton and Polygon Offsetting]</ref>. Это единственная открытая реализация построения <tex> \mathrm{straight}\ \mathrm{skeleton} </tex>. Однако этот данный алгоритм всё равно ещё достаточно медленный. В реальной жизни используют его модификации или более сложные алгоритмы.
Сначала алгоритм будет рассмотрен на простом случае {{---}} выпуклом многоугольнике, {{---}} а потом на невыпуклом многоугольнике.
=== Выпуклый полигон ===