Тема: Локализация точки в системе графов
Задание: Плоская многоугольная сетка задана следующим образом: дан список точек, каждая из которых задана двумя своими координатами, и список ячеек, для каж- дой из которых записаны последовательно против часовой стрелки номера вер- шин из первого списка точек. При этом гарантируется, что любые две ячейки либо не имеют общих точек, либо имеют одну общую вершину, либо примыкают к одному общему отрезку (т.е. имеют общую сторону и две общих вершины).
Требуется идентифицировать положение, т.е. установить принадлежность конкретной ячейке, системы точек, про которые известно лишь то, что они лежат строго внутри ячеек.
Описание: К методу перебора будет относиться метод трассировки луча. Полагаем, что из нашей точки (исследуемая точка) выпускается горизонтальный луч, направленный в ту же сторону, что и положительное направление оси абсцисс. После этого нужно проверить количество пересечений лучом каждой ячейки. Делать это можно, к примеру, в цикле for(). Подсчитав количество пересечений луча с ребрами одной ячейки, можно сделать вывод о принадлежности точки ячейке. Если пересечений четное количество – точка не лежит в ячейке, если же нечетное – лежит.
Эффективными методами решения задачи об определении местоположения точки в системе являются те методы, для которых время запроса составляет O(log n). Таковым является «метод полос», он же «Slab decomposition method». Суть данного метода состоит в том, чтобы выполнить два бинарных поиска, сложность каждого из которых O(log n). Проведя через все вершины ячеек горизонтальные (вертикальные) полосы, мы получим возможность определить точку между двух полос. Это будет первый бинарный поиск. Так как внутри полос ребра ячеек не могут пересекаться, то мы можем упорядочить их слева направо (снизу вверх) и вторым бинарным поиском определить между ребрами какой ячейки лежит наша точка.