Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона
Алгоритм Бойера–Ватсона --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного.
Содержание
1 Свойства и структура алгоритма
1.1 Общее описание алгоритма
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.
1.2 Математическое описание алгоритма
Триангуля́ция Делоне́ — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.
Итерации алгоритма строятся следующим образом: На нулевой итерации строится треугольник, покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника. Далее итеративно выполняются следующие действия:
- Добавляется новая точка
- Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.
- Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.
1.3 Вычислительное ядро алгоритма
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за O(|S|), однако эта сложность может быть в среднем уменьшена до O(log|S|) при структурировании пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать O(|S|) действий.
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за O(1).
Учитывая итерации по объектам, в худшем случае вне зависимости от использования структурирования пространства получается сложность O(|S|2). Однако средняя оценка при структурировании снижается до O(|S| log|S|).
1.4 Макроструктура алгоритма
1.5 Схема реализации последовательного алгоритма
After every insertion, any triangles whose circumcircles contain the new point are deleted, leaving a star-shaped polygonal hole which is then re-triangulated using the new point. By using the connectivity of the triangulation to efficiently locate triangles to remove, the algorithm can take O(N log N) operations to triangulate N points, although special degenerate cases exist where this goes up to O(N2).[1]
The algorithm is sometimes known just as the Bowyer Algorithm or the Watson Algorithm. Adrian Bowyer and David Watson devised it independently of each other at the same time, and each published a paper on it in the same issue of The Computer Journal (see below).
1.6 Pseudocode
The following pseudocode describes a basic implementation of the Bowyer-Watson algorithm. Efficiency can be improved in a number of ways. For example, the triangle connectivity can be used to locate the triangles which contain the new point in their circumcircle, without having to check all of the triangles. Pre-computing the circumcircles can save time at the expense of additional memory usage. And if the points are uniformly distributed, sorting them along a space filling Hilbert curve prior to insertion can also speed point location.[2]
function BowyerWatson (pointList)
// pointList is a set of coordinates defining the points to be triangulated
triangulation := empty triangle mesh data structure
add super-triangle to triangulation // must be large enough to completely contain all the points in pointList
for each point in pointList do // add all the points one at a time to the triangulation
badTriangles := empty set
for each triangle in triangulation do // first find all the triangles that are no longer valid due to the insertion
if point is inside circumcircle of triangle
add triangle to badTriangles
polygon := empty set
for each triangle in badTriangles do // find the boundary of the polygonal hole
for each edge in triangle do
if edge is not shared by any other triangles in badTriangles
add edge to polygon
for each triangle in badTriangles do // remove them from the data structure
remove triangle from triangulation
for each edge in polygon do // re-triangulate the polygonal hole
newTri := form a triangle from edge to point
add newTri to triangulation
for each triangle in triangulation // done inserting points, now clean up
if triangle contains a vertex from original super-triangle
remove triangle from triangulation
return triangulation
1.7 See also
1.8 References
- Шаблон:Cite journal
- Шаблон:Cite journal
- Efficient Triangulation Algorithm Suitable for Terrain Modelling generic explanations with source code examples in several languages.