Участник:RS42/Quickhull
Содержание
1 Свойства и структура алгоритмов
1.1 Общее описание алгоритма
Задача построения выпуклой оболочки является одной из важных проблем вычислительной геометрии. Выпуклую оболочку множества точек X можно определить следующим образом: это пересечение всевозможных выпуклых множеств, содержащих X. В случае конечного числа n точек из X:
- \mathrm{Conv}(X)=\left\{\left.\sum_{i=1}^{n} \alpha_i x_i\ \right| (\forall i: \alpha_i\ge 0)\wedge \sum_{i=1}^{n} \alpha_i=1 \right\}.
Алгоритм Quickhull позволяет провести построение в пространстве произвольной размерности d. Результатом работы является множество d-1-мерных граней (facets) и вершин (vertices) полученной выпуклой оболочки.
1.2 Математическое описание алгоритма
Наложим на множество X следующее условие: любые d+1 точки аффинно независимы (что тождественно тому, что они не лежат в одной d-1 плоскости). Выпуклая оболочка будет задаваться списком вершин и граней. Для каждой грани известны ее вершины, ее соседние грани и уравнение гиперплоскости, в которой эта грань лежит. Ребро (ridge) определяется как пересечение двух соседних граней и имеет размерность d-2. Граница грани состоит из ребер.
Нам понадобится вычисление ориентированного расстояния от некоей точки x до гиперплоскости (signed distance to hyperplane). Зададим начало координат в точке O, плоскость определяется нормалью \vec n и смещением h относительно начала координат. Тогда ориентированное расстояние будет равно (\vec x, \vec n) - h, где \vec x = x - O. Если ориентированное расстояние положительно, то можно сказать, что точка находится выше плоскости (или плоскость видна из точки). В нашем случае все грани выпуклой оболочки во время построения будут иметь такие нормали и смещения, что для точек внутри оболочки расстояния до каждой плоскости будут неположительными.
create a simplex of d+1 points
for each facet F
for each unassigned point p
if p is above F
assign p to F's outside set
for each facet F with non-empty outside set
select the furthest point p of F's outside set
initialize the visible set V to F
for all unvisited neighbors N of facets in V
if p is above N
add N to V
the boundary of V is the set of horizon ridges H
for each ridge R in H
create a new facet from R and p
link the new facet to its neighbors
for each new facet G
for each unassigned point q in an outside set of a facet in V
if q is above G
assign q to outside set of G
delete the facets in V
2 Программная реализация алгоритма
3 Литература
- Barber, C.B., Dobkin, D.P., and Huhdanpaa, H.T., "The Quickhull algorithm for convex hulls," ACM Trans. on Mathematical Software, 22(4):469-483, Dec 1996, http://www.qhull.org