Ответ обновлен и переписан с нуля.
Вам предоставляется многогранник . Запуск Добкин-Kirkpatric иерархии на P. Это дает последовательность многогранников P 1 ⊆ P 2 ⊆ ... ⊆ P к = P . Предположим, вы хотите найти ближайшую точку на P к точке запроса q . Основные начинается алгоритм вычисления по ближайшей точке гр 1 к ц на P 1 , то он считает , что все новые регионы (палатки) , прилегающие к C 1 , найти ближайшую точку гр 2 к цPP1⊆P2⊆…⊆Pk=PPqc1qP1c1c2qв этих новых регионах, и продолжайте в том же духе, пока мы не достигнем .Pk
Теперь, если находится на краю, тогда нет никаких проблем - только две палатки могут касаться этого края, или только одна из них может покрывать край. Таким образом, обновление c i + 1 от C i в этом случае занимает постоянное время.cici+1Ci
Поэтому проблема в том, что когда лежит в вершине высокой степени, потому что тогда число новых палаток, смежных с ней, при переходе к P i + 1 может быть большим. Чтобы преодолеть это, мы собираемся смоделировать вершину большой степени как набор вершин, имеющих низкую степень. В частности, на каждом этапе, если c i лежит в вершине v , мы будем помнить два последовательных ребра e i , e ′ i, смежных с v , так что ближайшая точка к q в P i + 1ciPi+1civei,e′ivqPi+1лежит на палатке, которая либо смежна, либо покрывает один из этих двух краев. Таким образом, мы можем выполнять необходимые вычисления за постоянное время.
Таким образом, мы остаемся с проблемой того, как отслеживать эти два края, когда мы поднимаемся.
Для этого предварительно вычислите для каждой вершины из P касательное направление t v . Пусть Q i ( v ) - выпуклый многоугольник, который является вершиной v для многоугольника P i (плоскость, определяющая вершину, имеет нормаль в направлении t v ). Концептуально, Q 1 ( v ) , Q 2 ( v ) , . , , , Q k ( v )vPtvQi(v)vPitvQ1(v),Q2(v),...,Qk(v)ведет себя как 2d иерархия DK. Если ближайшая точка на к q лежит на вершине w, то это соответствует v и смежному ребру e в P i , где ребро e пересекает плоскость фигуры вершины в точке w . Если ближайшая точка на Q i ( v ) к q лежит на ребре e ′ , то вы помните два смежных ребра P i, которые определяют две вершины e ′ (здесьQi(v)qwvePiewQi(v)qe′Pie′ принадлежит Q i ( v ) ).e′Qi(v)
И теперь мы закончили ... Действительно, если также находится на Q i + 1 ( v ), то мы можем обновить его за постоянное время (так как это просто 2d иерархия DK). Если, с другой стороны, c i + 1 больше не находится на Q i + 1 ( v ), то он должен принадлежать новой смежной палатке или покрывать предыдущую точку c i . В любом случае мы можем обновить его в постоянное время.ci+1Qi+1(v)ci+1Qi+1(v)ci