Estoy interesado en la complejidad de decidir si un polígono no simple dado es casi simple, en cualquiera de los dos sentidos formales diferentes: débilmente simple o no autocruzamiento . Dado que estos términos no son ampliamente conocidos, permítanme comenzar con algunas definiciones.
Un polígono es el ciclo cerrado de segmentos de línea que conectan una secuencia finita de puntos en el plano. Los puntos se llaman vértices del polígono, y los segmentos se llaman sus bordes . Podemos especificar cualquier polígono simplemente enumerando sus vértices en orden.
Un polígono es sencilla si todos los vértices son distintos y los bordes se cruzan solamente en sus extremos. De manera equivalente, un polígono es simple si es homeomorfo a un círculo y cada borde tiene una longitud positiva. Sin embargo, en general, los vértices y los bordes de un polígono pueden cruzarse arbitrariamente o incluso coincidir. 1
Considere dos rutas poligonales y cuya intersección es una subruta común de ambas (posiblemente un solo punto). Decimos que y cruz si sus puntos finales se alternan en el límite de una zona común de la subtrazado . Un polígono se cruza automáticamente si tiene dos subrutas cruzadas y, de lo contrario, no se cruza . 2
Un polígono es débilmente simple si es el límite de una secuencia de polígonos simples, o de manera equivalente, si hay una perturbación arbitrariamente pequeña de los vértices que hace que el polígono sea simple. Cada polígono débilmente simple no se cruza a sí mismo; sin embargo, algunos polígonos que no se cruzan no son débilmente simples.
Por ejemplo, considere los seis puntos muestran a continuación.
El polígono es simple; Ver la figura de la izquierda.
El polígono es débilmente simple; la figura del medio muestra un polígono simple cercano. Sin embargo, este polígono no es simple, porque visita tres veces.
El polígono se sí mismo, porque los subrutas y cruzan. Vea la figura correcta para un poco de intuición.b p q z y q p a
Por último, el polígono (que serpentea dos veces alrededor del polígono medio) no es auto-cruce, pero es no sencilla débilmente. Intuitivamente, el número de giro de este polígono es , mientras que el número de giro de cualquier polígono simple debe ser . (¡Una prueba formal requiere un análisis de casos, en parte porque el número de giro no está realmente bien definido para polígonos con ángulos !)± 2 ± 1 0 ∘
Actualización (13 de septiembre): en la figura a continuación, el polígono no se cruza automáticamente y tiene el número de giro 1 , pero no es débilmente simple. Podría decirse que el polígono tiene varios subwalks no simples de cruce , pero no tiene subpaths simples de cruce . (Digo "posiblemente" porque no está claro cómo definir cuándo se cruzan dos paseos no simples).
Entonces, finalmente, aquí están mis preguntas reales:
¿Qué tan rápido podemos determinar si un polígono dado no se cruza a sí mismo?
¿Qué tan rápido podemos determinar si un polígono dado es débilmente simple?
El primer problema se puede resolver en tiempo siguiente manera. Como hay vértices, hay subárboles de vértice a vértice; podemos probar si algún subpaso en particular es simple en el tiempo (por fuerza bruta). Para cada par de subrutas simples de vértice a vértice, podemos probar si se cruzan en el tiempo . Pero este no puede ser el mejor algoritmo posible.n O ( n 2 ) O ( n 2 ) O ( n )
No sé si el segundo problema se puede resolver en tiempo polinómico. Creo que puedo calcular rápidamente un número de giro bien definido para cualquier polígono no simple (a menos que la unión de los bordes del polígono sea solo una ruta, en cuyo caso el polígono debe ser débilmente simple); mira mi respuesta a continuación. Sin embargo, el nuevo polígono de ejemplo anterior implica que el número 1 sin autocruzamiento y giro no implica débilmente simple.
Podemos determinar si un polígono dado es sencilla en tiempo comprobando cada par de bordes de intersección, o en tiempo utilizando un algoritmo de sweepline estándar, o incluso en tiempo usando el algoritmo de triangulación de Chazelle. (Si el polígono de entrada no es simple, cualquier algoritmo de triangulación arrojará una excepción, un bucle infinito o producirá una salida que no sea una triangulación válida). Pero ninguno de estos algoritmos resuelve los problemas que estoy preguntando. O ( n log n ) O ( n )
1 Branko Grünbaum. Polígonos: Meister tenía razón y Poinsot estaba equivocado pero prevaleció . Beiträge zur Algebra und Geometrie 53 (1): 57–71, 2012.
2 Ver, por ejemplo: Erik D. Demaine y Joseph O'Rourke. Algoritmos Geométricos Plegables: Vínculos, Origami, Poliedros . Cambridge University Press, 2007.
Respuestas:
Parece que la primera pregunta tiene un algoritmo (aunque esto probablemente tampoco sea óptimo). Suponiendo que hay un cruce, la clave para encontrarlo parece ser que los bordes que se deben encontrar son los que se encuentran inmediatamente a cada lado del subruta común. Por lo tanto, observamos todos los pares de pares consecutivos de aristas. Hay un número cuadrático de estos. Si encontramos un par de pares de aristas con vértices y tal manera que las aristas y sean las mismas, entonces seguimos el subtrayecto común hasta el final e inspeccionamos las aristas que lo dejan. Si forman un cruce junto con yO(n3) abc def bc ef ab de , entonces hemos terminado, de lo contrario pasamos al siguiente par. Seguir el subpath común es, como máximo, una operación de tiempo lineal, por lo que todo el algoritmo es .O(n3)
Este análisis probablemente no sea ajustado, ya que el número de veces que se seguirá un subruta común de longitud lineal no es lineal en el número de pares de pares. Debería haber solo un número constante de esos. De manera similar, si la longitud del subpaso común más largo es constante, entonces estamos bien en términos de la cantidad de tiempo que sigue a los subpatros comunes. Esperaría que el peor de los casos surja cuando hay una sola ruta secundaria de longitud que es común a las rutas secundarias . Luego están las interacciones y en cada interacción se siguen los bordes . Entonces, aún así, el número de aristas que se siguen esO(n−−√) O(n−−√) O(n) o(n2)O(n2)O(n−−√) o(n2) , y el límite lo proporciona el número de pares. Por lo tanto, supongo que el verdadero límite para este algoritmo es .O(n2)
fuente
A sugerencia de Pat Morin, aquí está mi idea para calcular el número de giro. Lo siento si esto es un poco descuidado; Todavía estoy luchando contra los demonios de notación. Además, el comentario de Pat a la respuesta de Chris revela que he ignorado algunos casos importantes degenerados. Pero publicaré esto aquí de todos modos en caso de que otros lo encuentren útil.
Para cualquier índice , deje que denote el ángulo externo con signo en el vértice ; Este es el ángulo en sentido antihorario entre los rayos y , normalizado al rango . (Toda la aritmética de índice es implícitamente mod .) El número de giro de se define como Déjame llamar a un vértice un estímulo si el ángulo interno eni θ(pi)=θ(pi−1,pi,pi+1) pi pi−1pi−→−− pipi+1−→−− −π≤θi≤π n P pipi0θiπ-πPPpi=pi+1Turn(P)Turn(P)=±1P
Ahora suponga que contiene una caminata de la forma , donde y el camino es la inversión de camino . Entonces es un estímulo; llama la raíz de . En este caso, permítame definir el ángulo externo en siguiente manera: (Pero qué siP p→r⇝s⇝r→q r ⇝ s sp≠q r⇝s s⇝r s r s s
Si es débilmente simple, entonces hay una simple -gon arbitrariamente cerca de ; tet sea el vértice de más cercano a . Cuando acerca a , el ángulo interno en acerca a cero. No es difícil demostrar (por inducción en la longitud de ) que el ángulo externo aproxima a .P n P~ P s~ P~ P P~ P s~ r⇝s θ(s~) θ~(s)
Si consiste completamente en una caminata seguida de su inversión, , entonces los ángulos externos en las espuelas y todavía no están bien definidos. Pero en este caso, creo que es débilmente simple si y solo si la caminata no se cruza a sí misma. (Hay casos más complejos en los que no puedo definir un número de giro modificado razonable, en particular, si el polígono va y viene a través de una sola caminata. Pero en todos estos casos, parece que el polígono es débilmente simple si y solo si no se cruza a sí mismo)P r⇝s⇝r r s P r⇝s
De lo contrario, si definimos para cualquier vértice no recto , ahora tenemos un número de giro bien definido , que debe ser si es débilmente simple.θ~(pi)=θ(pi) pi Turn˜(P)=∑iθ~(pi)/2π=Turn(P~) ±1 P
Ya no estoy seguro de que se pueda calcular en tiempo lineal. La principal dificultad es que la caminata puede contener espuelas. El ingenuo algoritmo que encuentra la raíz de cada espolón por fuerza bruta en realidad lleva tiempo en el peor de los casos; considere un -gon que tiene un subcampo de longitud que simplemente alterna entre dos puntos.r⇝sΘ(n2)nΩ(n)Turn˜(P) r⇝s Θ(n2) n Ω(n)
fuente