Участник:RS42/Quickhull: различия между версиями
RS42 (обсуждение | вклад) (Новая страница: « = Свойства и структура алгоритмов = == Общее описание алгоритма == Задача построения выпу…») |
RS42 (обсуждение | вклад) |
||
Строка 5: | Строка 5: | ||
Задача построения выпуклой оболочки является одной из важных проблем вычислительной геометрии. Выпуклую оболочку множества точек <math>X</math> можно определить следующим образом: это пересечение всевозможных выпуклых множеств, содержащих <math>X</math>. В случае конечного числа <math>n</math> точек из <math>X</math>: | Задача построения выпуклой оболочки является одной из важных проблем вычислительной геометрии. Выпуклую оболочку множества точек <math>X</math> можно определить следующим образом: это пересечение всевозможных выпуклых множеств, содержащих <math>X</math>. В случае конечного числа <math>n</math> точек из <math>X</math>: | ||
:<math>\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\}.</math> | :<math>\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\}.</math> | ||
− | + | Алгоритм Quickhull позволяет провести построение в пространстве произвольной размерности <math>d</math>. Результатом работы является множество <math>d-1</math>-мерных граней (facets) и вершин (vertices) | |
+ | полученной выпуклой оболочки. | ||
== Математическое описание алгоритма == | == Математическое описание алгоритма == | ||
− | + | Наложим на множество <math>X</math> следующее условие: любые <math>d+1</math> точки аффинно независимы (что тождественно тому, что они не лежат в одной <math>d-1</math> плоскости). | |
− | + | Выпуклая оболочка будет задаваться списком вершин и граней. Для каждой грани известны ее вершины, ее соседние грани и уравнение гиперплоскости, в которой эта грань лежит. | |
+ | Ребро (ridge) определяется как пересечение двух соседних граней и имеет размерность <math>d-2</math>. Граница грани состоит из ребер. | ||
+ | Нам понадобиться вычисление ориентированного расстояния от некоей точки <math>x</math> до гиперплоскости (signed distance to hyperplane). Зададим начало координат в точке <math>O</math>, плоскость определяется нормалью | ||
+ | <math>\vec n</math> и смещением <math>h</math> относительно начала координат. Тогда ориентированное расстояние будет равно <math>(\vec x, \vec n) - h</math>, где <math>\vec x = x - O</math>. | ||
+ | Если ориентированное расстояние положительно, то можно сказать, что точка находится выше плоскости (или плоскость видна из точки). В нашем случае все грани выпуклой оболочки во время построения будут иметь | ||
+ | такие нормали и смещения, что для точек внутри оболочки расстояния до каждой плоскости будут неположительными. | ||
+ | <source> | ||
+ | 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 | ||
+ | </source> | ||
= Программная реализация алгоритма = | = Программная реализация алгоритма = | ||
= Литература = | = Литература = | ||
*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 | *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 |
Версия 01:02, 21 октября 2017
Содержание
1 Свойства и структура алгоритмов
1.1 Общее описание алгоритма
Задача построения выпуклой оболочки является одной из важных проблем вычислительной геометрии. Выпуклую оболочку множества точек [math]X[/math] можно определить следующим образом: это пересечение всевозможных выпуклых множеств, содержащих [math]X[/math]. В случае конечного числа [math]n[/math] точек из [math]X[/math]:
- [math]\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\}.[/math]
Алгоритм Quickhull позволяет провести построение в пространстве произвольной размерности [math]d[/math]. Результатом работы является множество [math]d-1[/math]-мерных граней (facets) и вершин (vertices) полученной выпуклой оболочки.
1.2 Математическое описание алгоритма
Наложим на множество [math]X[/math] следующее условие: любые [math]d+1[/math] точки аффинно независимы (что тождественно тому, что они не лежат в одной [math]d-1[/math] плоскости). Выпуклая оболочка будет задаваться списком вершин и граней. Для каждой грани известны ее вершины, ее соседние грани и уравнение гиперплоскости, в которой эта грань лежит. Ребро (ridge) определяется как пересечение двух соседних граней и имеет размерность [math]d-2[/math]. Граница грани состоит из ребер.
Нам понадобиться вычисление ориентированного расстояния от некоей точки [math]x[/math] до гиперплоскости (signed distance to hyperplane). Зададим начало координат в точке [math]O[/math], плоскость определяется нормалью [math]\vec n[/math] и смещением [math]h[/math] относительно начала координат. Тогда ориентированное расстояние будет равно [math](\vec x, \vec n) - h[/math], где [math]\vec x = x - O[/math]. Если ориентированное расстояние положительно, то можно сказать, что точка находится выше плоскости (или плоскость видна из точки). В нашем случае все грани выпуклой оболочки во время построения будут иметь такие нормали и смещения, что для точек внутри оболочки расстояния до каждой плоскости будут неположительными.
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