Реализация алгоритма.
На
входе мы имеем набор точек, входящих в
область [O;
S],
для которых нужно построить диаграмму
Вороного. Все точки должны быть
уникальными. Данный алгоритм можно
назвать «событийным».
Основа
алгоритма – итерационная обработка
событий. Событий в алгоритме два вида,
событие точки и событие круга.
Соответственно нам нужен список событий.
Заметающая прямая опускается сверху
вниз, от события к событию, поэтому нам
нужен сортированный по высоте список
событий.
Событие
точки, это рассмотренное выше добавление
арки в береговую линию. Соответственно
для каждой точки нам нужно создать
событие точки. Событие круга, это удаление
арки. События круга возникают динамически,
в процессе выполнения алгоритма.
Т.к.
список событий точек нам известен
заранее, а список событий круга не
известен, для каждого вида событий
создадим разные списки. Это уменьшит
потребление памяти и увеличит
быстродействие. Элементы обоих списков
отсортированы по высоте сверху вниз, в
случае совпадения высоты события
сортируются справа налево.
Упорядоченный
список событий точек.
std::vector<SiteEvent>
mSiteEvents;
Упорядоченный
список событий круга.
std::multiset<CircleEvent
*, CircleEventComparator> mCircleEvents;
Источники
информации:
http://hijos.ru/2011/12/28/kazhdyj-v-svoej-oblasti-i-voronoj-dlya-vsex/
https://en.wikipedia.org/wiki/Voronoi_diagram
http://en.wikipedia.org/wiki/Fortune%27s_algorithm
https://ru.wikipedia.org/wiki/Диаграмма_Вороного
http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/
-