<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=D.Polykovskiy</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=D.Polykovskiy"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/D.Polykovskiy"/>
	<updated>2026-10-23T01:49:25Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=19217</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=19217"/>
		<updated>2016-11-26T11:50:09Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; - метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt;, однако эта сложность может быть в среднем уменьшена до &amp;lt;math&amp;gt;O(log|S|)&amp;lt;/math&amp;gt;  при структурировании  пространства (например, KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &amp;lt;math&amp;gt;(x, y) \to (x, y, x^2+y^2)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt; тогда и только тогда, когда они компланарны в пространстве &amp;lt;math&amp;gt;(x, y, x^2+y^2)&amp;lt;/math&amp;gt;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &amp;lt;math&amp;gt;O(|S|^2)&amp;lt;/math&amp;gt;. Однако средняя оценка при структурировании снижается до  &amp;lt;math&amp;gt;O(|S| log|S|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть алгоритма поиск поврежденных треугольников. Это действие можно распараллелить, проводя проверку на повреждение параллельно для каждого треугольника. Поиск дублирующихся ребер также можно распараллелить, однако эта часть программы не являются ресурсоемкой: количество поврежденных треугольников редко бывает большим.&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
==Свойства алгоритма==&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Бойера-Ватсона. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Запустим реализацию на различных наборах точек и различном числе нитей (по логарифмической сетке), запросив 16 ядер Intel Xeon X5570. &lt;br /&gt;
&lt;br /&gt;
Полученный график сильной масштабируемости приведен ниже.&lt;br /&gt;
&lt;br /&gt;
[[File:BW_run.png]]&lt;br /&gt;
&lt;br /&gt;
Видно, что при увеличении количества нитей, время работы постепенно снижается, однако когда число нитей превышает удвоенное число запрошенных ядер, эффективность реализации снижается. Это происходит из-за нарастающих накладных расходов на параллелизм. Эффект падения эффективности при 32 процессорах и числе точек 2704 связан с особенностью структуры точек: требовался многократный пересчет поврежденных треугольников.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/Bl4ckb0ne/delaunay-triangulation&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=19215</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=19215"/>
		<updated>2016-11-26T11:48:30Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; - метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt;, однако эта сложность может быть в среднем уменьшена до &amp;lt;math&amp;gt;O(log|S|)&amp;lt;/math&amp;gt;  при структурировании  пространства (например, KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &amp;lt;math&amp;gt;(x, y) \to (x, y, x^2+y^2)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt; тогда и только тогда, когда они компланарны в пространстве &amp;lt;math&amp;gt;(x, y, x^2+y^2)&amp;lt;/math&amp;gt;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &amp;lt;math&amp;gt;O(|S|^2)&amp;lt;/math&amp;gt;. Однако средняя оценка при структурировании снижается до  &amp;lt;math&amp;gt;O(|S| log|S|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть алгоритма поиск поврежденных треугольников. Это действие можно распараллелить, проводя проверку на повреждение параллельно для каждого треугольника. Поиск дублирующихся ребер также можно распараллелить, однако эта часть программы не являются ресурсоемкой: количество поврежденных треугольников редко бывает большим.&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
==Свойства алгоритма==&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Бойера-Ватсона. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Запустим реализацию на различных наборах точек и различном числе нитей (по логарифмической сетке), запросив 8 ядер Intel Xeon X5570. &lt;br /&gt;
&lt;br /&gt;
Полученный график сильной масштабируемости приведен ниже.&lt;br /&gt;
&lt;br /&gt;
[[File:BW_run.png]]&lt;br /&gt;
&lt;br /&gt;
Видно, что при увеличении количества нитей, время работы постепенно снижается, однако когда число нитей превышает удвоенное число запрошенных ядер, эффективность реализации снижается. Это происходит из-за нарастающих накладных расходов на параллелизм. Эффект падения эффективности при 32 процессорах и числе точек 2704 связан с особенностью структуры точек: требовался многократный пересчет поврежденных треугольников.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/Bl4ckb0ne/delaunay-triangulation&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18060</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18060"/>
		<updated>2016-11-18T09:13:57Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; - метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt;, однако эта сложность может быть в среднем уменьшена до &amp;lt;math&amp;gt;O(log|S|)&amp;lt;/math&amp;gt;  при структурировании  пространства (например, KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &amp;lt;math&amp;gt;(x, y) \to (x, y, x^2+y^2)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt; тогда и только тогда, когда они компланарны в пространстве &amp;lt;math&amp;gt;(x, y, x^2+y^2)&amp;lt;/math&amp;gt;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &amp;lt;math&amp;gt;O(|S|^2)&amp;lt;/math&amp;gt;. Однако средняя оценка при структурировании снижается до  &amp;lt;math&amp;gt;O(|S| log|S|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть алгоритма поиск поврежденных треугольников. Это действие можно распараллелить, проводя проверку на повреждение параллельно для каждого треугольника. Поиск дублирующихся ребер также можно распараллелить, однако эта часть программы не являются ресурсоемкой: количество поврежденных треугольников редко бывает большим.&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
==Свойства алгоритма==&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации алгоритма Бойера-Ватсона согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Запустим реализацию на различных наборах точек и различном числе нитей (по логарифмической сетке), запросив 8 ядер Intel Xeon X5570. &lt;br /&gt;
&lt;br /&gt;
Полученный график сильной масштабируемости приведен ниже.&lt;br /&gt;
&lt;br /&gt;
[[File:BW_run.png]]&lt;br /&gt;
&lt;br /&gt;
Видно, что при увеличении количества нитей, время работы постепенно снижается, однако когда число нитей превышает удвоенное число запрошенных ядер, эффективность реализации снижается. Это происходит из-за нарастающих накладных расходов на параллелизм. Эффект падения эффективности при 32 процессорах и числе точек 2704 связан с особенностью структуры точек: требовался многократный пересчет поврежденных треугольников.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/Bl4ckb0ne/delaunay-triangulation&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18059</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18059"/>
		<updated>2016-11-18T09:12:24Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; - метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt;, однако эта сложность может быть в среднем уменьшена до &amp;lt;math&amp;gt;O(log|S|)&amp;lt;/math&amp;gt;  при структурировании  пространства (например, KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &amp;lt;math&amp;gt;(x, y) \to (x, y, x^2+y^2)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt; тогда и только тогда, когда они компланарны в пространстве &amp;lt;math&amp;gt;(x, y, x^2+y^2)&amp;lt;/math&amp;gt;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &amp;lt;math&amp;gt;O(|S|^2)&amp;lt;/math&amp;gt;. Однако средняя оценка при структурировании снижается до  &amp;lt;math&amp;gt;O(|S| log|S|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть алгоритма поиск поврежденных треугольников. Это действие можно распараллелить, проводя проверку на повреждение параллельно для каждого треугольника. Поиск дублирующихся ребер также можно распараллелить, однако эта часть программы не являются ресурсоемкой: количество поврежденных треугольников редко бывает большим.&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
==Свойства алгоритма==&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации разложения Холецкого согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Запустим реализацию на различных наборах точек и различном числе нитей (по логарифмической сетке), запросив 8 ядер Intel Xeon X5570. &lt;br /&gt;
&lt;br /&gt;
Полученный график сильной масштабируемости приведен ниже.&lt;br /&gt;
&lt;br /&gt;
[[File:BW_run.png]]&lt;br /&gt;
&lt;br /&gt;
Видно, что при увеличении количества нитей, время работы постепенно снижается, однако когда число нитей превышает удвоенное число запрошенных ядер, эффективность реализации снижается. Это происходит из-за нарастающих накладных расходов на параллелизм. Эффект падения эффективности при 32 процессорах и числе точек 2704 связан с особенностью структуры точек: требовался многократный пересчет поврежденных треугольников.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/Bl4ckb0ne/delaunay-triangulation&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18058</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18058"/>
		<updated>2016-11-18T09:11:10Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: /* Проверка на вхождение в описанную окружность */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; - метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt;, однако эта сложность может быть в среднем уменьшена до &amp;lt;math&amp;gt;O(log|S|)&amp;lt;/math&amp;gt;  при структурировании  пространства (например, KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &amp;lt;math&amp;gt;(x, y) \to (x, y, x^2+y^2)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &amp;lt;math&amp;gt;(x, y)&amp;lt;/math&amp;gt; тогда и только тогда, когда они компланарны в пространстве &amp;lt;math&amp;gt;(x, y, x^2+y^2)&amp;lt;/math&amp;gt;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть алгоритма поиск поврежденных треугольников. Это действие можно распараллелить, проводя проверку на повреждение параллельно для каждого треугольника. Поиск дублирующихся ребер также можно распараллелить, однако эта часть программы не являются ресурсоемкой: количество поврежденных треугольников редко бывает большим.&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
==Свойства алгоритма==&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации разложения Холецкого согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Запустим реализацию на различных наборах точек и различном числе нитей (по логарифмической сетке), запросив 8 ядер Intel Xeon X5570. &lt;br /&gt;
&lt;br /&gt;
Полученный график сильной масштабируемости приведен ниже.&lt;br /&gt;
&lt;br /&gt;
[[File:BW_run.png]]&lt;br /&gt;
&lt;br /&gt;
Видно, что при увеличении количества нитей, время работы постепенно снижается, однако когда число нитей превышает удвоенное число запрошенных ядер, эффективность реализации снижается. Это происходит из-за нарастающих накладных расходов на параллелизм. Эффект падения эффективности при 32 процессорах и числе точек 2704 связан с особенностью структуры точек: требовался многократный пересчет поврежденных треугольников.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/Bl4ckb0ne/delaunay-triangulation&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18057</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18057"/>
		<updated>2016-11-18T09:09:52Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; - метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt;, однако эта сложность может быть в среднем уменьшена до &amp;lt;math&amp;gt;O(log|S|)&amp;lt;/math&amp;gt;  при структурировании  пространства (например, KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &amp;lt;math&amp;gt;O(|S|)&amp;lt;/math&amp;gt; действий.&lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &#039;&#039;(x, y) -&amp;gt; (x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &#039;&#039;(x, y)&#039;&#039; тогда и только тогда, когда они компланарны в пространстве &#039;&#039;(x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть алгоритма поиск поврежденных треугольников. Это действие можно распараллелить, проводя проверку на повреждение параллельно для каждого треугольника. Поиск дублирующихся ребер также можно распараллелить, однако эта часть программы не являются ресурсоемкой: количество поврежденных треугольников редко бывает большим.&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
==Свойства алгоритма==&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации разложения Холецкого согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Запустим реализацию на различных наборах точек и различном числе нитей (по логарифмической сетке), запросив 8 ядер Intel Xeon X5570. &lt;br /&gt;
&lt;br /&gt;
Полученный график сильной масштабируемости приведен ниже.&lt;br /&gt;
&lt;br /&gt;
[[File:BW_run.png]]&lt;br /&gt;
&lt;br /&gt;
Видно, что при увеличении количества нитей, время работы постепенно снижается, однако когда число нитей превышает удвоенное число запрошенных ядер, эффективность реализации снижается. Это происходит из-за нарастающих накладных расходов на параллелизм. Эффект падения эффективности при 32 процессорах и числе точек 2704 связан с особенностью структуры точек: требовался многократный пересчет поврежденных треугольников.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/Bl4ckb0ne/delaunay-triangulation&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18055</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18055"/>
		<updated>2016-11-18T09:06:11Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; - метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &#039;&#039;O(|S|)&#039;&#039;, однако эта сложность может быть в среднем уменьшена до &#039;&#039;O(log|S|)&#039;&#039;  при структурировании  пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &#039;&#039;O(|S|)&#039;&#039; действий. &lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &#039;&#039;(x, y) -&amp;gt; (x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &#039;&#039;(x, y)&#039;&#039; тогда и только тогда, когда они компланарны в пространстве &#039;&#039;(x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть алгоритма поиск поврежденных треугольников. Это действие можно распараллелить, проводя проверку на повреждение параллельно для каждого треугольника. Поиск дублирующихся ребер также можно распараллелить, однако эта часть программы не являются ресурсоемкой: количество поврежденных треугольников редко бывает большим.&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
==Свойства алгоритма==&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации разложения Холецкого согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Запустим реализацию на различных наборах точек и различном числе нитей (по логарифмической сетке), запросив 8 ядер Intel Xeon X5570. &lt;br /&gt;
&lt;br /&gt;
Полученный график сильной масштабируемости приведен ниже.&lt;br /&gt;
&lt;br /&gt;
[[File:BW_run.png]]&lt;br /&gt;
&lt;br /&gt;
Видно, что при увеличении количества нитей, время работы постепенно снижается, однако когда число нитей превышает удвоенное число запрошенных ядер, эффективность реализации снижается. Это происходит из-за нарастающих накладных расходов на параллелизм. Эффект падения эффективности при 32 процессорах и числе точек 2704 связан с особенностью структуры точек: требовался многократный пересчет поврежденных треугольников.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/Bl4ckb0ne/delaunay-triangulation&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18050</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=18050"/>
		<updated>2016-11-18T07:59:17Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &#039;&#039;O(|S|)&#039;&#039;, однако эта сложность может быть в среднем уменьшена до &#039;&#039;O(log|S|)&#039;&#039;  при структурировании  пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &#039;&#039;O(|S|)&#039;&#039; действий. &lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &#039;&#039;(x, y) -&amp;gt; (x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &#039;&#039;(x, y)&#039;&#039; тогда и только тогда, когда они компланарны в пространстве &#039;&#039;(x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть алгоритма поиск поврежденных треугольников. Это действие можно распараллелить, проводя проверку на повреждение параллельно для каждого треугольника. Поиск дублирующихся ребер также можно распараллелить, однако эта часть программы не являются ресурсоемкой: количество поврежденных треугольников редко бывает большим.&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
==Свойства алгоритма==&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
Проведём исследование масштабируемости параллельной реализации разложения Холецкого согласно [[Scalability methodology|методике]]. Исследование проводилось на суперкомпьютере &amp;quot;Ломоносов&amp;quot;&amp;lt;ref name=&amp;quot;Lom&amp;quot;&amp;gt;Воеводин Вл., Жуматий С., Соболев С., Антонов А., Брызгалов П., Никитенко Д., Стефанов К., Воеводин Вад. Практика суперкомпьютера «Ломоносов» // Открытые системы, 2012, N 7, С. 36-39.&amp;lt;/ref&amp;gt; [http://parallel.ru/cluster Суперкомпьютерного комплекса Московского университета].&lt;br /&gt;
&lt;br /&gt;
Запустим реализацию на различных наборах точек и различном числе нитей (по логарифмической сетке), запросив 8 ядер Intel Xeon X5570. &lt;br /&gt;
&lt;br /&gt;
Полученный график сильной масштабируемости приведен ниже.&lt;br /&gt;
&lt;br /&gt;
[[File:BW_run.png]]&lt;br /&gt;
&lt;br /&gt;
Видно, что при увеличении количества нитей, время работы постепенно снижается, однако когда число нитей превышает удвоенное число запрошенных ядер, эффективность реализации снижается. Это происходит из-за нарастающих накладных расходов на параллелизм. Эффект падения эффективности при 32 процессорах и числе точек 2704 связан с особенностью структуры точек: требовался многократный пересчет поврежденных треугольников.&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/Bl4ckb0ne/delaunay-triangulation&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=17507</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=17507"/>
		<updated>2016-11-15T22:56:09Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &#039;&#039;O(|S|)&#039;&#039;, однако эта сложность может быть в среднем уменьшена до &#039;&#039;O(log|S|)&#039;&#039;  при структурировании  пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &#039;&#039;O(|S|)&#039;&#039; действий. &lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &#039;&#039;(x, y) -&amp;gt; (x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &#039;&#039;(x, y)&#039;&#039; тогда и только тогда, когда они компланарны в пространстве &#039;&#039;(x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть алгоритма поиск поврежденных треугольников. Это действие можно распараллелить, проводя проверку на повреждение параллельно для каждого треугольника. Поиск дублирующихся ребер также можно распараллелить, однако эта часть программы не являются ресурсоемкой: количество поврежденных треугольников редко бывает большим.&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
==Свойства алгоритма==&lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Особенности реализации последовательного алгоритма==&lt;br /&gt;
==Локальность данных и вычислений==&lt;br /&gt;
==Возможные способы и особенности параллельной реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
==Динамические характеристики и эффективность реализации алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Выводы для классов архитектур==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/Bl4ckb0ne/delaunay-triangulation&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=17474</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=17474"/>
		<updated>2016-11-15T21:06:18Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &#039;&#039;O(|S|)&#039;&#039;, однако эта сложность может быть в среднем уменьшена до &#039;&#039;O(log|S|)&#039;&#039;  при структурировании  пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &#039;&#039;O(|S|)&#039;&#039; действий. &lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &#039;&#039;(x, y) -&amp;gt; (x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &#039;&#039;(x, y)&#039;&#039; тогда и только тогда, когда они компланарны в пространстве &#039;&#039;(x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть алгоритма поиск поврежденных треугольников. Это действие можно распараллелить, проводя проверку на повреждение параллельно для каждого треугольника. Поиск дублирующихся ребер также можно распараллелить, однако эта часть программы не являются ресурсоемкой: количество поврежденных треугольников редко бывает большим.&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=17471</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=17471"/>
		<updated>2016-11-15T21:00:04Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (супер-треугольник), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий супер-треугольник&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины супер-треугольника.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &#039;&#039;O(|S|)&#039;&#039;, однако эта сложность может быть в среднем уменьшена до &#039;&#039;O(log|S|)&#039;&#039;  при структурировании  пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &#039;&#039;O(|S|)&#039;&#039; действий. &lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &#039;&#039;(x, y) -&amp;gt; (x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &#039;&#039;(x, y)&#039;&#039; тогда и только тогда, когда они компланарны в пространстве &#039;&#039;(x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение супер-треугольника===&lt;br /&gt;
Построить супер-треугольник можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем супер-треугольник в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины супер-треугольника&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
Информационный граф рассматриваемого алгоритма получается напрямую из его описания:&lt;br /&gt;
[[Файл:BW.png|thumb|center|400px]]&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
Самая трудоемкая часть --- поиск &lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16609</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16609"/>
		<updated>2016-11-12T23:10:45Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (super-triangle), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий super-triangle&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины super-triangle.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &#039;&#039;O(|S|)&#039;&#039;, однако эта сложность может быть в среднем уменьшена до &#039;&#039;O(log|S|)&#039;&#039;  при структурировании  пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &#039;&#039;O(|S|)&#039;&#039; действий. &lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &#039;&#039;(x, y) -&amp;gt; (x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &#039;&#039;(x, y)&#039;&#039; тогда и только тогда, когда они компланарны в пространстве &#039;&#039;(x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение super-triangle===&lt;br /&gt;
Построить super-triangle можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем super-triangle в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины super-triangle&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Информационный граф==&lt;br /&gt;
&lt;br /&gt;
==Ресурс параллелизма алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Входные и выходные данные алгоритма==&lt;br /&gt;
Входными данными алгоритма служит вектор точек пространства. Предполагается, что все точки различны. На выходе получается вектор троек координат вершин треугольников, образующих триангуляцию исходного множества. &lt;br /&gt;
&lt;br /&gt;
=Программная реализация алгоритма=&lt;br /&gt;
==Масштабируемость алгоритма и его реализации==&lt;br /&gt;
&lt;br /&gt;
==Существующие реализации алгоритма==&lt;br /&gt;
Реализации данного алгоритма  не присутствуют в популярных пакетах. Тем не менее, существует несколько доступных реализаций на github:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/axelboc/voronoi-delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;https://github.com/ayron/delaunay&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Литература=&lt;br /&gt;
&amp;lt;ref&amp;gt;C.A.Arens The Bowyer-Watson algorithm: An efficient implementation in a database environment&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16607</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16607"/>
		<updated>2016-11-12T22:36:03Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (super-triangle), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий super-triangle&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины super-triangle.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &#039;&#039;O(|S|)&#039;&#039;, однако эта сложность может быть в среднем уменьшена до &#039;&#039;O(log|S|)&#039;&#039;  при структурировании  пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &#039;&#039;O(|S|)&#039;&#039; действий. &lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &#039;&#039;(x, y) -&amp;gt; (x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;&amp;lt;ref&amp;gt;Leonidas J. Guibas, Jorge Stolfi Primitives for the manipulation of general subdivisions and the computation of Voronoi, ACM Transactions on Graphics &amp;lt;/ref&amp;gt;&lt;br /&gt;
В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &#039;&#039;(x, y)&#039;&#039; тогда и только тогда, когда они компланарны в пространстве &#039;&#039;(x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение super-triangle===&lt;br /&gt;
Построить super-triangle можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===Поиск границы объединения треугольников===&lt;br /&gt;
Эту задачу требуется решить только для связного множества треугольников. Поэтому достаточно взять все ребра треугольников и выкинуть дублирующиеся. Оставшиеся ребра будут образовывать искомый многоугольник.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем super-triangle в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины super-triangle&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Последовательная сложность алгоритма==&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
В худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16606</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16606"/>
		<updated>2016-11-12T22:28:20Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (super-triangle), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий super-triangle&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины super-triangle.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &#039;&#039;O(|S|)&#039;&#039;, однако эта сложность может быть в среднем уменьшена до &#039;&#039;O(log|S|)&#039;&#039;  при структурировании  пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &#039;&#039;O(|S|)&#039;&#039; действий. &lt;br /&gt;
&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Учитывая итерации по объектам, в худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &#039;&#039;(x, y) -&amp;gt; (x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;&amp;lt;ref&amp;gt;{{cite journal&lt;br /&gt;
  | last1 = Guibas&lt;br /&gt;
  | first1 = Leonidas&lt;br /&gt;
  | authorlink1 = Leonidas J. Guibas&lt;br /&gt;
  | last2 = Stolfi&lt;br /&gt;
  | first2 = Jorge&lt;br /&gt;
  | authorlink2 = Jorge Stolfi&lt;br /&gt;
  | title = Primitives for the manipulation of general subdivisions and the computation of Voronoi&lt;br /&gt;
  | journal = [[ACM Transactions on Graphics]]&lt;br /&gt;
  | volume = 4&lt;br /&gt;
  | pages = 74–123&lt;br /&gt;
  | year = 1985&lt;br /&gt;
  | doi = 10.1145/282918.282923&lt;br /&gt;
  | issue = 2&lt;br /&gt;
  | url = http://portal.acm.org/citation.cfm?id=282923 }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;. В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &#039;&#039;(x, y)&#039;&#039; тогда и только тогда, когда они компланарны в пространстве &#039;&#039;(x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение super-triangle===&lt;br /&gt;
Построить super-triangle можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList - множество точек для триангуляции&lt;br /&gt;
      triangulation := пустое множество треугольников&lt;br /&gt;
      Добавляем super-triangle в триангуляцию&lt;br /&gt;
      for each point in pointList do // последовательно добавляем точки&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // находим поврежденные треугольники&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // находим границу дырки&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // удаляем поврежденные треугольники&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // заполняем дырку&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // убираем вершины super-triangle&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudocode==&lt;br /&gt;
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.&amp;lt;ref&amp;gt;Liu, Yuanxin, and Jack Snoeyink. &amp;quot;A comparison of five implementations of 3D Delaunay tessellation.&amp;quot; Combinatorial and Computational Geometry 52 (2005): 439-458.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList is a set of coordinates defining the points to be triangulated&lt;br /&gt;
      triangulation := empty triangle mesh data structure&lt;br /&gt;
      add super-triangle to triangulation // must be large enough to completely contain all the points in pointList&lt;br /&gt;
      for each point in pointList do // add all the points one at a time to the triangulation&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // first find all the triangles that are no longer valid due to the insertion&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // find the boundary of the polygonal hole&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // remove them from the data structure&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // re-triangulate the polygonal hole&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // done inserting points, now clean up&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Fortune&#039;s algorithm]]&lt;br /&gt;
* [[Delaunay triangulation]]&lt;br /&gt;
* [[Computational geometry]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{reflist}}&lt;br /&gt;
*{{Cite journal | last1 = Bowyer | first1 = Adrian |author1-link=Adrian Bowyer| title = Computing Dirichlet tessellations | doi = 10.1093/comjnl/24.2.162 | journal = [[The Computer Journal|Comput. J.]] | volume = 24 | issue = 2 | pages = 162–166 | year = 1981 | pmid =  | pmc = }}&lt;br /&gt;
*{{Cite journal | last1 = Watson | first1 = David F. | authorlink1 = | title = Computing the &#039;&#039;n&#039;&#039;-dimensional Delaunay tessellation with application to Voronoi polytopes | doi = 10.1093/comjnl/24.2.167 | journal = [[The Computer Journal|Comput. J.]] | volume = 24 | issue = 2 | pages = 167–172 | year = 1981 | pmid =  | pmc = }}&lt;br /&gt;
* [http://paulbourke.net/papers/triangulate/ Efficient Triangulation Algorithm Suitable for Terrain Modelling] generic explanations with source code examples in several languages.&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Bowyer-Watson algorithm}}&lt;br /&gt;
[[Category:Geometric algorithms]]&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16605</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16605"/>
		<updated>2016-11-12T22:25:30Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник (super-triangle), покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|Помещение первой вершины в охватывающий super-triangle&lt;br /&gt;
File:Bowyer-Watson 1.png|Вторая вершина&lt;br /&gt;
File:Bowyer-Watson 2.png|Третья вершина&lt;br /&gt;
File:Bowyer-Watson 3.png|Четвертая вершина&lt;br /&gt;
File:Bowyer-Watson 4.png|Пятая вергина&lt;br /&gt;
File:Bowyer-Watson 6.png|Убираем вершины super-triangle.&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &#039;&#039;O(|S|)&#039;&#039;, однако эта сложность может быть в среднем уменьшена до &#039;&#039;O(log|S|)&#039;&#039;  при структурировании  пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &#039;&#039;O(|S|)&#039;&#039; действий. &lt;br /&gt;
&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Учитывая итерации по объектам, в худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
===Проверка на вхождение в описанную окружность===&lt;br /&gt;
Для работы алгоритма требуется уметь проверять точку D на принадлежность описанной окружности треугольника ABC. Для двумерного случая это может быть сделано при помощи перехода в 3D пространство по схеме &#039;&#039;(x, y) -&amp;gt; (x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;&amp;lt;ref&amp;gt;{{cite journal&lt;br /&gt;
  | last1 = Guibas&lt;br /&gt;
  | first1 = Leonidas&lt;br /&gt;
  | authorlink1 = Leonidas J. Guibas&lt;br /&gt;
  | last2 = Stolfi&lt;br /&gt;
  | first2 = Jorge&lt;br /&gt;
  | authorlink2 = Jorge Stolfi&lt;br /&gt;
  | title = Primitives for the manipulation of general subdivisions and the computation of Voronoi&lt;br /&gt;
  | journal = [[ACM Transactions on Graphics]]&lt;br /&gt;
  | volume = 4&lt;br /&gt;
  | pages = 74–123&lt;br /&gt;
  | year = 1985&lt;br /&gt;
  | doi = 10.1145/282918.282923&lt;br /&gt;
  | issue = 2&lt;br /&gt;
  | url = http://portal.acm.org/citation.cfm?id=282923 }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;. В новом пространстве точке расположены на параболоиде. Утверждается, что четыре точки коцикличны в &#039;&#039;(x, y)&#039;&#039; тогда и только тогда, когда они компланарны в пространстве &#039;&#039;(x, y, x&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;+y&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Пользуясь выпуклостью парабалоида, можно сформулировать критерий принадлежности точки описанной окружности: достаточно проверить неотрицательность определителя матрицы (предполагается, что точки расположены против часовой стрелки)&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\begin{vmatrix}&lt;br /&gt;
A_x &amp;amp; A_y &amp;amp; A_x^2 + A_y^2 &amp;amp; 1\\&lt;br /&gt;
B_x &amp;amp; B_y &amp;amp; B_x^2 + B_y^2 &amp;amp; 1\\&lt;br /&gt;
C_x &amp;amp; C_y &amp;amp; C_x^2 + C_y^2 &amp;amp; 1\\&lt;br /&gt;
D_x &amp;amp; D_y &amp;amp; D_x^2 + D_y^2 &amp;amp; 1&lt;br /&gt;
\end{vmatrix} = \begin{vmatrix}&lt;br /&gt;
A_x - D_x &amp;amp; A_y - D_y &amp;amp; (A_x^2 - D_x^2) + (A_y^2 - D_y^2) \\&lt;br /&gt;
B_x - D_x &amp;amp; B_y - D_y &amp;amp; (B_x^2 - D_x^2) + (B_y^2 - D_y^2) \\&lt;br /&gt;
C_x - D_x &amp;amp; C_y - D_y &amp;amp; (C_x^2 - D_x^2) + (C_y^2 - D_y^2)&lt;br /&gt;
\end{vmatrix} &amp;gt; 0&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Построение super-triangle===&lt;br /&gt;
Построить super-triangle можно множеством способов. Например, можно найти разброс (&#039;&#039;max-min&#039;&#039;) значений координат точек вдоль каждой из осей. Затем можно вычислить максимальное среди этих значений, обозначив его за &#039;&#039;w&#039;&#039;. После этого можно взять центр масс точек &#039;&#039;S&#039;&#039; и отступить от него вверх на &#039;&#039;2w&#039;&#039; (точка A), вниз на 2w и влево на 2w (точка B) и, наконец, вниз на 2w и вправо на 2w (точка C). Треугольник ABC будет заведомо содержать все точки из &#039;&#039;S&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList is a set of coordinates defining the points to be triangulated&lt;br /&gt;
      triangulation := empty triangle mesh data structure&lt;br /&gt;
      add super-triangle to triangulation // must be large enough to completely contain all the points in pointList&lt;br /&gt;
      for each point in pointList do // add all the points one at a time to the triangulation&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // first find all the triangles that are no longer valid due to the insertion&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // find the boundary of the polygonal hole&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // remove them from the data structure&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // re-triangulate the polygonal hole&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // done inserting points, now clean up&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 After every insertion, any triangles whose circumcircles contain the new point are deleted, leaving a [[star-shaped polygon]]al 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 &#039;&#039;O(N log N)&#039;&#039; operations to triangulate N points, although special degenerate cases exist where this goes up to &#039;&#039;O(N&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;.&amp;lt;ref&amp;gt;Rebay, S. &#039;&#039;Efficient Unstructured Mesh Generation by Means of Delaunay Triangulation and Bowyer-Watson Algorithm&#039;&#039;. Journal of Computational Physics Volume 106 Issue 1, May 1993, p. 127.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The algorithm is sometimes known just as the &#039;&#039;&#039;Bowyer Algorithm&#039;&#039;&#039; or the &#039;&#039;&#039;Watson Algorithm&#039;&#039;&#039;.  [[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 &#039;&#039;[[The Computer Journal]]&#039;&#039; (see below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|First step: insert a node in an enclosing &amp;quot;super&amp;quot;-triangle&lt;br /&gt;
File:Bowyer-Watson 1.png|Insert second node&lt;br /&gt;
File:Bowyer-Watson 2.png|Insert third node&lt;br /&gt;
File:Bowyer-Watson 3.png|Insert fourth node&lt;br /&gt;
File:Bowyer-Watson 4.png|Insert fifth (and last) node&lt;br /&gt;
File:Bowyer-Watson 6.png|Remove super-triangle edges&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudocode==&lt;br /&gt;
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.&amp;lt;ref&amp;gt;Liu, Yuanxin, and Jack Snoeyink. &amp;quot;A comparison of five implementations of 3D Delaunay tessellation.&amp;quot; Combinatorial and Computational Geometry 52 (2005): 439-458.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList is a set of coordinates defining the points to be triangulated&lt;br /&gt;
      triangulation := empty triangle mesh data structure&lt;br /&gt;
      add super-triangle to triangulation // must be large enough to completely contain all the points in pointList&lt;br /&gt;
      for each point in pointList do // add all the points one at a time to the triangulation&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // first find all the triangles that are no longer valid due to the insertion&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // find the boundary of the polygonal hole&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // remove them from the data structure&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // re-triangulate the polygonal hole&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // done inserting points, now clean up&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Fortune&#039;s algorithm]]&lt;br /&gt;
* [[Delaunay triangulation]]&lt;br /&gt;
* [[Computational geometry]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{reflist}}&lt;br /&gt;
*{{Cite journal | last1 = Bowyer | first1 = Adrian |author1-link=Adrian Bowyer| title = Computing Dirichlet tessellations | doi = 10.1093/comjnl/24.2.162 | journal = [[The Computer Journal|Comput. J.]] | volume = 24 | issue = 2 | pages = 162–166 | year = 1981 | pmid =  | pmc = }}&lt;br /&gt;
*{{Cite journal | last1 = Watson | first1 = David F. | authorlink1 = | title = Computing the &#039;&#039;n&#039;&#039;-dimensional Delaunay tessellation with application to Voronoi polytopes | doi = 10.1093/comjnl/24.2.167 | journal = [[The Computer Journal|Comput. J.]] | volume = 24 | issue = 2 | pages = 167–172 | year = 1981 | pmid =  | pmc = }}&lt;br /&gt;
* [http://paulbourke.net/papers/triangulate/ Efficient Triangulation Algorithm Suitable for Terrain Modelling] generic explanations with source code examples in several languages.&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Bowyer-Watson algorithm}}&lt;br /&gt;
[[Category:Geometric algorithms]]&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16604</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16604"/>
		<updated>2016-11-12T22:03:59Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. &lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма = &lt;br /&gt;
==Общее описание алгоритма==&lt;br /&gt;
Алгоритм Бойера–Ватсона позволяет построить триангуляцию Деолне конечного множества точек в пространстве любой размерности. Он относится к семейству инкрементальных, т.е. проводит построение путем поочередного добавления точек, получая при этом на каждом шаге корректную триангуляцию Делоне текущего подмножества точек.&lt;br /&gt;
&lt;br /&gt;
==Математическое описание алгоритма==&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — триангуляция заданного множества точек S на плоскости (или в пространстве большей размерности), при которой для любого треугольника все точки из S за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. На многомерный случай алгоритм обобщается путем замены треугольников на многомерные симплексы.&lt;br /&gt;
&lt;br /&gt;
Итерации алгоритма строятся следующим образом:&lt;br /&gt;
На нулевой итерации строится треугольник, покрывающий все точки множества (таким образом множество S пополняется тремя вспомогательными точками). Начальное множество треугольников состоит только из этого треугольника.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из множества треугольников выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Доказано, что после завершения каждой итерации будет получена корректная триангуляция Делоне.&lt;br /&gt;
&lt;br /&gt;
На последнем шаге алгоритма выкидываются треугольники, содержащие в качестве вершины вспомогательную.&lt;br /&gt;
&lt;br /&gt;
==Вычислительное ядро алгоритма==&lt;br /&gt;
Большая часть времени работы алгоритма приходится на поиск поврежденных треугольников. В простейшей реализации это делается за &#039;&#039;O(|S|)&#039;&#039;, однако эта сложность может быть в среднем уменьшена до &#039;&#039;O(log|S|)&#039;&#039;  при структурировании  пространства (нпр., KD-деревом). Тем не менее в худшем случае поиск все равно будет требовать  &#039;&#039;O(|S|)&#039;&#039; действий. &lt;br /&gt;
&lt;br /&gt;
В среднем число поврежденных треугольников оказывается малым, поэтому все действия кроме поиска выполняются в среднем за &#039;&#039;O(1)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Учитывая итерации по объектам, в худшем случае вне зависимости от использования структурирования пространства получается сложность &#039;&#039;O(|S|&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;. Однако средняя оценка при структурировании снижается до  &#039;&#039;O(|S| log|S|)&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
==Макроструктура алгоритма==&lt;br /&gt;
&lt;br /&gt;
==Схема реализации последовательного алгоритма==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 After every insertion, any triangles whose circumcircles contain the new point are deleted, leaving a [[star-shaped polygon]]al 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 &#039;&#039;O(N log N)&#039;&#039; operations to triangulate N points, although special degenerate cases exist where this goes up to &#039;&#039;O(N&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;.&amp;lt;ref&amp;gt;Rebay, S. &#039;&#039;Efficient Unstructured Mesh Generation by Means of Delaunay Triangulation and Bowyer-Watson Algorithm&#039;&#039;. Journal of Computational Physics Volume 106 Issue 1, May 1993, p. 127.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The algorithm is sometimes known just as the &#039;&#039;&#039;Bowyer Algorithm&#039;&#039;&#039; or the &#039;&#039;&#039;Watson Algorithm&#039;&#039;&#039;.  [[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 &#039;&#039;[[The Computer Journal]]&#039;&#039; (see below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|First step: insert a node in an enclosing &amp;quot;super&amp;quot;-triangle&lt;br /&gt;
File:Bowyer-Watson 1.png|Insert second node&lt;br /&gt;
File:Bowyer-Watson 2.png|Insert third node&lt;br /&gt;
File:Bowyer-Watson 3.png|Insert fourth node&lt;br /&gt;
File:Bowyer-Watson 4.png|Insert fifth (and last) node&lt;br /&gt;
File:Bowyer-Watson 6.png|Remove super-triangle edges&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudocode==&lt;br /&gt;
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.&amp;lt;ref&amp;gt;Liu, Yuanxin, and Jack Snoeyink. &amp;quot;A comparison of five implementations of 3D Delaunay tessellation.&amp;quot; Combinatorial and Computational Geometry 52 (2005): 439-458.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList is a set of coordinates defining the points to be triangulated&lt;br /&gt;
      triangulation := empty triangle mesh data structure&lt;br /&gt;
      add super-triangle to triangulation // must be large enough to completely contain all the points in pointList&lt;br /&gt;
      for each point in pointList do // add all the points one at a time to the triangulation&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // first find all the triangles that are no longer valid due to the insertion&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // find the boundary of the polygonal hole&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // remove them from the data structure&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // re-triangulate the polygonal hole&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // done inserting points, now clean up&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Fortune&#039;s algorithm]]&lt;br /&gt;
* [[Delaunay triangulation]]&lt;br /&gt;
* [[Computational geometry]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{reflist}}&lt;br /&gt;
*{{Cite journal | last1 = Bowyer | first1 = Adrian |author1-link=Adrian Bowyer| title = Computing Dirichlet tessellations | doi = 10.1093/comjnl/24.2.162 | journal = [[The Computer Journal|Comput. J.]] | volume = 24 | issue = 2 | pages = 162–166 | year = 1981 | pmid =  | pmc = }}&lt;br /&gt;
*{{Cite journal | last1 = Watson | first1 = David F. | authorlink1 = | title = Computing the &#039;&#039;n&#039;&#039;-dimensional Delaunay tessellation with application to Voronoi polytopes | doi = 10.1093/comjnl/24.2.167 | journal = [[The Computer Journal|Comput. J.]] | volume = 24 | issue = 2 | pages = 167–172 | year = 1981 | pmid =  | pmc = }}&lt;br /&gt;
* [http://paulbourke.net/papers/triangulate/ Efficient Triangulation Algorithm Suitable for Terrain Modelling] generic explanations with source code examples in several languages.&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Bowyer-Watson algorithm}}&lt;br /&gt;
[[Category:Geometric algorithms]]&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16593</id>
		<title>Участник:D.Polykovskiy/Алгоритм Бойера-Ватсона</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D0%BE%D0%B9%D0%B5%D1%80%D0%B0-%D0%92%D0%B0%D1%82%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=16593"/>
		<updated>2016-11-12T21:00:57Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: Новая страница: « Алгоритм &amp;#039;&amp;#039;&amp;#039;Бойера–Ватсона&amp;#039;&amp;#039;&amp;#039; --- метод, позволяющий построить триангуляцию Делоне конечн…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Алгоритм &#039;&#039;&#039;Бойера–Ватсона&#039;&#039;&#039; --- метод, позволяющий построить триангуляцию Делоне конечного множества точек в пространстве любой размерности. Как следствие, алгоритм позволяет получить диаграму Вороного. Этот алгоритм относится к семейству инкрементальных, т.е. проводит построение, поочередно добавляя точки и получая на каждом шаге корректную триангуляцию Делоне текущего подмножества точек. &lt;br /&gt;
&lt;br /&gt;
Изначально строится один треугольник, покрывающий все точки множества.&lt;br /&gt;
Далее итеративно выполняются следующие действия:&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Добавляется новая точка&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Из триангуляции выкидываются все треугольники, в описанную окружность в которых попадает новая точка. Таким образом в триангуляции образуется дырка в форме многоугольника.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Эта дырка заполняется треугольниками, содержащими новую точку в качестве одной вершины и ребрами дырки в качестве противолежащей стороны.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 After every insertion, any triangles whose circumcircles contain the new point are deleted, leaving a [[star-shaped polygon]]al 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 &#039;&#039;O(N log N)&#039;&#039; operations to triangulate N points, although special degenerate cases exist where this goes up to &#039;&#039;O(N&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&#039;&#039;.&amp;lt;ref&amp;gt;Rebay, S. &#039;&#039;Efficient Unstructured Mesh Generation by Means of Delaunay Triangulation and Bowyer-Watson Algorithm&#039;&#039;. Journal of Computational Physics Volume 106 Issue 1, May 1993, p. 127.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The algorithm is sometimes known just as the &#039;&#039;&#039;Bowyer Algorithm&#039;&#039;&#039; or the &#039;&#039;&#039;Watson Algorithm&#039;&#039;&#039;.  [[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 &#039;&#039;[[The Computer Journal]]&#039;&#039; (see below).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:Bowyer-Watson 0.png|First step: insert a node in an enclosing &amp;quot;super&amp;quot;-triangle&lt;br /&gt;
File:Bowyer-Watson 1.png|Insert second node&lt;br /&gt;
File:Bowyer-Watson 2.png|Insert third node&lt;br /&gt;
File:Bowyer-Watson 3.png|Insert fourth node&lt;br /&gt;
File:Bowyer-Watson 4.png|Insert fifth (and last) node&lt;br /&gt;
File:Bowyer-Watson 6.png|Remove super-triangle edges&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pseudocode==&lt;br /&gt;
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.&amp;lt;ref&amp;gt;Liu, Yuanxin, and Jack Snoeyink. &amp;quot;A comparison of five implementations of 3D Delaunay tessellation.&amp;quot; Combinatorial and Computational Geometry 52 (2005): 439-458.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
   function BowyerWatson (pointList)&lt;br /&gt;
      // pointList is a set of coordinates defining the points to be triangulated&lt;br /&gt;
      triangulation := empty triangle mesh data structure&lt;br /&gt;
      add super-triangle to triangulation // must be large enough to completely contain all the points in pointList&lt;br /&gt;
      for each point in pointList do // add all the points one at a time to the triangulation&lt;br /&gt;
         badTriangles := empty set&lt;br /&gt;
         for each triangle in triangulation do // first find all the triangles that are no longer valid due to the insertion&lt;br /&gt;
            if point is inside circumcircle of triangle&lt;br /&gt;
               add triangle to badTriangles&lt;br /&gt;
         polygon := empty set&lt;br /&gt;
         for each triangle in badTriangles do // find the boundary of the polygonal hole&lt;br /&gt;
            for each edge in triangle do&lt;br /&gt;
               if edge is not shared by any other triangles in badTriangles&lt;br /&gt;
                  add edge to polygon&lt;br /&gt;
         for each triangle in badTriangles do // remove them from the data structure&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
         for each edge in polygon do // re-triangulate the polygonal hole&lt;br /&gt;
            newTri := form a triangle from edge to point&lt;br /&gt;
            add newTri to triangulation&lt;br /&gt;
      for each triangle in triangulation // done inserting points, now clean up&lt;br /&gt;
         if triangle contains a vertex from original super-triangle&lt;br /&gt;
            remove triangle from triangulation&lt;br /&gt;
      return triangulation &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[Fortune&#039;s algorithm]]&lt;br /&gt;
* [[Delaunay triangulation]]&lt;br /&gt;
* [[Computational geometry]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{reflist}}&lt;br /&gt;
*{{Cite journal | last1 = Bowyer | first1 = Adrian |author1-link=Adrian Bowyer| title = Computing Dirichlet tessellations | doi = 10.1093/comjnl/24.2.162 | journal = [[The Computer Journal|Comput. J.]] | volume = 24 | issue = 2 | pages = 162–166 | year = 1981 | pmid =  | pmc = }}&lt;br /&gt;
*{{Cite journal | last1 = Watson | first1 = David F. | authorlink1 = | title = Computing the &#039;&#039;n&#039;&#039;-dimensional Delaunay tessellation with application to Voronoi polytopes | doi = 10.1093/comjnl/24.2.167 | journal = [[The Computer Journal|Comput. J.]] | volume = 24 | issue = 2 | pages = 167–172 | year = 1981 | pmid =  | pmc = }}&lt;br /&gt;
* [http://paulbourke.net/papers/triangulate/ Efficient Triangulation Algorithm Suitable for Terrain Modelling] generic explanations with source code examples in several languages.&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Bowyer-Watson algorithm}}&lt;br /&gt;
[[Category:Geometric algorithms]]&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%A2%D1%80%D0%B8%D0%B0%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%94%D0%B5%D0%BB%D0%BE%D0%BD%D0%B5&amp;diff=16587</id>
		<title>Участник:D.Polykovskiy/Триангуляция Делоне</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:D.Polykovskiy/%D0%A2%D1%80%D0%B8%D0%B0%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%94%D0%B5%D0%BB%D0%BE%D0%BD%D0%B5&amp;diff=16587"/>
		<updated>2016-11-12T19:59:12Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: Init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Значения|Триангуляция}}&lt;br /&gt;
[[Файл:Delaunay_circumcircles_vectorial.svg|right|thumb|280px|Пример триангуляции Делоне. Из каждой точки порождается окружность, проходящая через две ближайшие в [[Евклидова метрика|метрике Евклида]] точки.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — [[триангуляция (геометрия)|триангуляция]] для заданного множества точек {{mvar|S}} на плоскости, при которой для любого треугольника все точки из {{mvar|S}} за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. Обозначается {{math|DT(&#039;&#039;S&#039;&#039;)}}. Впервые описана в [[1934 год в науке|1934 году]] советским математиком [[Делоне, Борис Николаевич|Борисом Делоне]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
* Триангуляция Делоне взаимно однозначно соответствует [[диаграмма Вороного|диаграмме Вороного]] для того же множества точек.&lt;br /&gt;
* Как следствие: если никакие четыре точки не лежат на одной окружности, триангуляция Делоне единственна.&lt;br /&gt;
* Триангуляция Делоне максимизирует минимальный угол среди всех углов всех построенных треугольников, тем самым избегаются «тонкие» треугольники.&lt;br /&gt;
* Триангуляция Делоне максимизирует сумму радиусов вписанных шаров.&lt;br /&gt;
* Триангуляция Делоне минимизирует [[дискретный функционал Дирихле]].&lt;br /&gt;
* Триангуляция Делоне минимизирует максимальный радиус минимального объемлющего шара.&lt;br /&gt;
* Триангуляция Делоне на плоскости обладает минимальной суммой радиусов окружностей, описанных около треугольников, среди всех возможных триангуляций{{sfn|Скворцов|2002|loc=теорема 3|с=11}}.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм «разделяй и властвуй» ==&lt;br /&gt;
{{main|Алгоритм Киркпатрика}}&lt;br /&gt;
Данный алгоритм основан на стандартной для многих алгоритмов методике сведения сложной задачи к более простым, в которых решение очевидно. Сам алгоритм для &#039;&#039;N&#039;&#039; &amp;gt; 1 состоит из 2 шагов:&lt;br /&gt;
# Разбиение исходного множества на более мелкие множества. Для этого мы проводим вертикальные или горизонтальные прямые в середине множества и уже относительно этих прямых разделяем точки на две части примерно по &#039;&#039;N&#039;&#039;/2. После для каждой группы точек рекурсивно запускаем процесс деления.&lt;br /&gt;
# Объединение оптимальных триангуляций. Сначала находятся две пары точек, отрезки которых образуют в совокупности с построенными триангуляциями выпуклую фигуру. Они соединяются отрезками, и один из полученных отрезков выбирается как начало для последующего обхода. Обход заключается в следующем: на этом отрезке мы как будто «надуваем пузырь» внутрь до первой точки, которую достигнет раздувающаяся окружность «пузыря». С найденной точкой соединяется та точка отрезка, которая не была с ней соединена. Полученный отрезок проверяется на пересечение с уже существующими отрезками триангуляции, и в случае пересечения они удаляются из триангуляции. После этого новый отрезок принимается за начало для нового «пузыря». Цикл повторяется до тех пор, пока начало не совпадёт со вторым отрезком выпуклой оболочки.&lt;br /&gt;
&lt;br /&gt;
Сложность разбиения множества &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt;, объединения — &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt; для каждого объединения, итоговая сложность алгоритма — &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;{{sfn|Скворцов|2002|loc=глава 3, алгоритм 3.1}}.&lt;br /&gt;
&lt;br /&gt;
== Вариации и обобщения ==&lt;br /&gt;
&lt;br /&gt;
* В трёхмерном пространстве возможна аналогичная конструкция с заменой окружностей на сферы.&lt;br /&gt;
* Также используются и обобщения при введении [[Метрическое пространство|метрик]], отличных от [[евклидово расстояние|евклидовой]].&lt;br /&gt;
* Одно из свойств триангуляции Делоне — минимальная сумма радиусов описанных кругов — можно применить для так называемой &#039;&#039;&#039;ограниченной триангуляции Делоне&#039;&#039;&#039;. Есть &#039;&#039;n&#039;&#039; точек, часть рёбер триангуляции уже проведены; провести остальные, чтобы сумма радиусов описанных кругов была наименьшей.&lt;br /&gt;
&lt;br /&gt;
== Применение ==&lt;br /&gt;
&lt;br /&gt;
[[Минимальное евклидово остовное дерево]] гарантированно располагается на триангуляции Делоне, поэтому некоторые алгоритмы пользуются триангуляцией. Также через триангуляцию Делоне приближённо решается [[Задача коммивояжёра#Метрическая задача|евклидова задача о коммивояжёре]].&lt;br /&gt;
&lt;br /&gt;
В двумерной [[интерполяция|интерполяции]] триангуляция Делоне разбивает плоскость на самые «толстые» треугольники, насколько это возможно, избегая слишком острых и слишком тупых углов. По этим треугольникам можно строить, например, [[билинейная интерполяция|билинейную интерполяцию]].&lt;br /&gt;
&lt;br /&gt;
[[Метод конечных элементов]] — метод численного решения дифференциальных уравнений в частных производных — предельно универсален, и с ростом мощи компьютеров и с отработкой стандартных библиотек становится всё более популярным. Однако, построение конечноэлементной сетки до последнего времени оставалось ручной работой. В большинстве вариантов метода конечных элементов погрешность обратно пропорциональна синусу минимального или максимального угла сетки, поэтому многие из алгоритмов автоматического построения сетки используют триангуляцию Делоне.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
 |автор = Скворцов А. В.&lt;br /&gt;
 |заглавие = Триангуляция Делоне и её применение&lt;br /&gt;
 |город = Томск&lt;br /&gt;
 |издательство = Изд-во Томского университета&lt;br /&gt;
 |год = 2002&lt;br /&gt;
 |страниц = 128&lt;br /&gt;
 |isbn = 5-7511-1501-5&lt;br /&gt;
 |ref = Скворцов&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Вычислительная геометрия]]&lt;br /&gt;
[[Категория:Комбинаторная геометрия]]&lt;br /&gt;
[[Категория:Геометрические алгоритмы]]&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A2%D1%80%D0%B8%D0%B0%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%94%D0%B5%D0%BB%D0%BE%D0%BD%D0%B5&amp;diff=16584</id>
		<title>Триангуляция Делоне</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A2%D1%80%D0%B8%D0%B0%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%94%D0%B5%D0%BB%D0%BE%D0%BD%D0%B5&amp;diff=16584"/>
		<updated>2016-11-12T19:50:08Z</updated>

		<summary type="html">&lt;p&gt;D.Polykovskiy: Страница создана. Далее ее содержимое будет постепенно наполняться.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Значения|Триангуляция}}&lt;br /&gt;
[[Файл:Delaunay_circumcircles_vectorial.svg|right|thumb|280px|Пример триангуляции Делоне. Из каждой точки порождается окружность, проходящая через две ближайшие в [[Евклидова метрика|метрике Евклида]] точки.]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Триангуля́ция Делоне́&#039;&#039;&#039; — [[триангуляция (геометрия)|триангуляция]] для заданного множества точек {{mvar|S}} на плоскости, при которой для любого треугольника все точки из {{mvar|S}} за исключением точек, являющихся его вершинами, лежат вне окружности, описанной вокруг треугольника. Обозначается {{math|DT(&#039;&#039;S&#039;&#039;)}}. Впервые описана в [[1934 год в науке|1934 году]] советским математиком [[Делоне, Борис Николаевич|Борисом Делоне]].&lt;br /&gt;
&lt;br /&gt;
== Свойства ==&lt;br /&gt;
&lt;br /&gt;
* Триангуляция Делоне взаимно однозначно соответствует [[диаграмма Вороного|диаграмме Вороного]] для того же множества точек.&lt;br /&gt;
* Как следствие: если никакие четыре точки не лежат на одной окружности, триангуляция Делоне единственна.&lt;br /&gt;
* Триангуляция Делоне максимизирует минимальный угол среди всех углов всех построенных треугольников, тем самым избегаются «тонкие» треугольники.&lt;br /&gt;
* Триангуляция Делоне максимизирует сумму радиусов вписанных шаров.&lt;br /&gt;
* Триангуляция Делоне минимизирует [[дискретный функционал Дирихле]].&lt;br /&gt;
* Триангуляция Делоне минимизирует максимальный радиус минимального объемлющего шара.&lt;br /&gt;
* Триангуляция Делоне на плоскости обладает минимальной суммой радиусов окружностей, описанных около треугольников, среди всех возможных триангуляций{{sfn|Скворцов|2002|loc=теорема 3|с=11}}.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм «разделяй и властвуй» ==&lt;br /&gt;
{{main|Алгоритм Киркпатрика}}&lt;br /&gt;
Данный алгоритм основан на стандартной для многих алгоритмов методике сведения сложной задачи к более простым, в которых решение очевидно. Сам алгоритм для &#039;&#039;N&#039;&#039; &amp;gt; 1 состоит из 2 шагов:&lt;br /&gt;
# Разбиение исходного множества на более мелкие множества. Для этого мы проводим вертикальные или горизонтальные прямые в середине множества и уже относительно этих прямых разделяем точки на две части примерно по &#039;&#039;N&#039;&#039;/2. После для каждой группы точек рекурсивно запускаем процесс деления.&lt;br /&gt;
# Объединение оптимальных триангуляций. Сначала находятся две пары точек, отрезки которых образуют в совокупности с построенными триангуляциями выпуклую фигуру. Они соединяются отрезками, и один из полученных отрезков выбирается как начало для последующего обхода. Обход заключается в следующем: на этом отрезке мы как будто «надуваем пузырь» внутрь до первой точки, которую достигнет раздувающаяся окружность «пузыря». С найденной точкой соединяется та точка отрезка, которая не была с ней соединена. Полученный отрезок проверяется на пересечение с уже существующими отрезками триангуляции, и в случае пересечения они удаляются из триангуляции. После этого новый отрезок принимается за начало для нового «пузыря». Цикл повторяется до тех пор, пока начало не совпадёт со вторым отрезком выпуклой оболочки.&lt;br /&gt;
&lt;br /&gt;
Сложность разбиения множества &amp;lt;math&amp;gt;O(\log N)&amp;lt;/math&amp;gt;, объединения — &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt; для каждого объединения, итоговая сложность алгоритма — &amp;lt;math&amp;gt;O(N \log N)&amp;lt;/math&amp;gt;{{sfn|Скворцов|2002|loc=глава 3, алгоритм 3.1}}.&lt;br /&gt;
&lt;br /&gt;
== Вариации и обобщения ==&lt;br /&gt;
&lt;br /&gt;
* В трёхмерном пространстве возможна аналогичная конструкция с заменой окружностей на сферы.&lt;br /&gt;
* Также используются и обобщения при введении [[Метрическое пространство|метрик]], отличных от [[евклидово расстояние|евклидовой]].&lt;br /&gt;
* Одно из свойств триангуляции Делоне — минимальная сумма радиусов описанных кругов — можно применить для так называемой &#039;&#039;&#039;ограниченной триангуляции Делоне&#039;&#039;&#039;. Есть &#039;&#039;n&#039;&#039; точек, часть рёбер триангуляции уже проведены; провести остальные, чтобы сумма радиусов описанных кругов была наименьшей.&lt;br /&gt;
&lt;br /&gt;
== Применение ==&lt;br /&gt;
&lt;br /&gt;
[[Минимальное евклидово остовное дерево]] гарантированно располагается на триангуляции Делоне, поэтому некоторые алгоритмы пользуются триангуляцией. Также через триангуляцию Делоне приближённо решается [[Задача коммивояжёра#Метрическая задача|евклидова задача о коммивояжёре]].&lt;br /&gt;
&lt;br /&gt;
В двумерной [[интерполяция|интерполяции]] триангуляция Делоне разбивает плоскость на самые «толстые» треугольники, насколько это возможно, избегая слишком острых и слишком тупых углов. По этим треугольникам можно строить, например, [[билинейная интерполяция|билинейную интерполяцию]].&lt;br /&gt;
&lt;br /&gt;
[[Метод конечных элементов]] — метод численного решения дифференциальных уравнений в частных производных — предельно универсален, и с ростом мощи компьютеров и с отработкой стандартных библиотек становится всё более популярным. Однако, построение конечноэлементной сетки до последнего времени оставалось ручной работой. В большинстве вариантов метода конечных элементов погрешность обратно пропорциональна синусу минимального или максимального угла сетки, поэтому многие из алгоритмов автоматического построения сетки используют триангуляцию Делоне.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
 |автор = Скворцов А. В.&lt;br /&gt;
 |заглавие = Триангуляция Делоне и её применение&lt;br /&gt;
 |город = Томск&lt;br /&gt;
 |издательство = Изд-во Томского университета&lt;br /&gt;
 |год = 2002&lt;br /&gt;
 |страниц = 128&lt;br /&gt;
 |isbn = 5-7511-1501-5&lt;br /&gt;
 |ref = Скворцов&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Вычислительная геометрия]]&lt;br /&gt;
[[Категория:Комбинаторная геометрия]]&lt;br /&gt;
[[Категория:Геометрические алгоритмы]]&lt;/div&gt;</summary>
		<author><name>D.Polykovskiy</name></author>
	</entry>
</feed>