Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Алгоритм Бентли Оттмана - Алгоритм23 января 2011Оглавление: 1. Алгоритм Бентли Оттмана 2. Обработка вертикальных отрезков 3. Алгоритм 4. Анализ В приведенном ниже псевдокоде используются:
segmentsIntersections
1) Инициализируются Q и T. В Q заносятся все концы отрезков, упорядоченные по координате x, при этом, если две точки совпали,
то левая конечная точка отрезка помещается перед правой. Если совпали только x, то точка с меньшим y является меньшей.
T ← ∅
2) while Q != ∅
q ← min;
processPoint;
processPoint
1) Найти в Q все отрезки, содержащие q; // они в Q будут соседними, так как точки события, которые содержатся в этих
отрезках, имеют одинаковые координаты;
2) if| + |R| + |I| > 1) ИЛИ| > 0)
then Выдать в ответ точку q;
3) if| = 0) И|+|R| > 0) // в рассматриваемой точке все отрезки только начинаются или заканчиваются;
then I ← I ∪ L ∪ R; // добавить в I L и R
4) Удалить из T R и I;
5) Вставить в T I и L;
// из T были удалены все отрезки из множества I, теперь же вставляются обратно в измененном порядке после точки пересечения;
6) if∪I = ∅) ИЛИ| = |R| - 1)
then Найти в T верхнего и нижнего соседей q su и sl;
newq = findIntersect;
if newq != NULL
then add;
7) else
Пусть s′ — самый верхний отрезок из L∪I;
Пусть su — верхний сосед s′ в T;
Пусть s′′ — самый нижний отрезок из L∪ I;
Пусть sl — нижний сосед s′′ в T;
newq = findIntersect;
if newq != NULL
then add;
newq = findIntersect;
if newq != NULL
then add;
// далее убираем квадрат памяти;
newq = findIntersect;
if newq != NULL
then delete;
newq = findIntersect;
if newq != NULL
then delete;
newq = findIntersect;
if newq != NULL
then delete;
findIntersect
if sl и su пересекаются правее заметающей прямой
then return newq;
else return NULL;
Просмотров: 6184
|