Respuesta actualizada y reescrita desde cero.
Se le da un politopo . Ejecutar la jerarquía Dobkin-KIRKPATRIC en P. Esto le da una secuencia de polytops . Supongamos que desea encontrar el punto más cercano en a un punto de consulta . El algoritmo básico comienza calculando el punto más cercano a en , luego considera todas las nuevas regiones (carpas) adyacentes a , encuentra el punto más cercano a en estas nuevas regiones y continúa de esta manera hasta llegar a .P 1 ⊆ P 2 ⊆ … ⊆ P k = P P q c 1 q P 1 c 1 c 2 q P kPP1⊆P2⊆…⊆Pk=PPqc1qP1c1c2qPk
Ahora, si está en un borde, entonces no hay problema: solo dos carpas pueden tocar este borde, o solo una de ellas puede cubrir el borde. Como tal, actualizar desde en este caso lleva tiempo constante.c i + 1 C icici+1Ci
Entonces, el problema es cuando encuentra en un vértice de alto grado, porque entonces el número de nuevas tiendas adyacentes a él cuando se mueve a puede ser grande. Para superar esto, vamos a simular un vértice de alto grado como una colección de vértices de bajo grado. En particular, en cada etapa, si encuentra en un vértice , vamos a recordar dos aristas consecutivas adyacentes a , de modo que el punto más cercano a en encuentra en una carpa que es adyacente o cubre uno de estos dos bordes. Como tal, podemos hacer el cálculo requerido en tiempo constante.P i + 1 c i v e i , e ′ i v q P i + 1ciPi+1civei,e′ivqPi+1
Así que seguimos con el problema de cómo hacer un seguimiento de estos dos bordes a medida que subimos.
Para hacer eso, precalcule para cada vértice de una dirección tangente . Deje ser el polígono convexo que es la figura del vértice de para el polígono (con el plano que define la figura del vértice tiene normal en la dirección de ). Conceptualmente, comporta como una jerarquía 2d DK. Si el punto más cercano en a encuentra en un vértice entonces esto corresponde a y un borde adyacente en , donde el bordeP t v Q i ( v ) v P i t v Q 1 ( v ) , Q 2 ( v ) , . . . , Q k ( v ) Q i ( v ) q w v e P i e w Q i ( v ) q e ′ P i e ′ evPtvQi(v)vPitvQ1(v),Q2(v),...,Qk(v)Qi(v)qwvePieinterseca el plano de la figura del vértice en . Si el punto más cercano en a encuentra en un borde , entonces recuerda los dos bordes adyacentes de que definen los dos vértices de (aquí pertenece a ).wQi(v)qe′Pie′Q i ( v )e′Qi(v)
Y ahora hemos terminado ... De hecho, si también está en entonces podemos actualizarlo en tiempo constante (ya que esto es solo una jerarquía 2d DK). Si, por otro lado, ya no está en entonces debe pertenecer a una nueva tienda adyacente o que cubra el punto anterior . En cualquier caso, podemos actualizarlo en tiempo constante.ci+1Qi+1(v)ci+1Qi+1(v)ci