Detectando dos tipos de polígonos casi simples


22

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.Pp0,p1,p2,,pn1pipipi+1modn

  • Un polígono es sencilla si todos los n 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 A y B cuya intersección es una subruta común de ambas (posiblemente un solo punto). Decimos que A y B cruz si sus puntos finales A(0),B(0),A(1),B(1) se alternan en el límite de una zona común de la subtrazado AB . 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 a,b,p,q,x,y muestran a continuación.

ingrese la descripción de la imagen aquí

  • El polígono abpqyz es simple; Ver la figura de la izquierda.

  • El polígono papbpqyqzq es débilmente simple; la figura del medio muestra un polígono simple cercano. Sin embargo, este polígono no es simple, porque visita p 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 apapbpqzqyqbpqzyqpa

  • 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 papbpqyqzqpapbpqyqzq±2±10

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).abcabcxyzxpqrxzyx

ingrese la descripción de la imagen aquí

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 )O(n5)nO(n2)O(n2)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 )O(n2)O(nlogn)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.


¡No entiendo por qué uno rechazaría esta pregunta!
Kaveh

Puede que esté malinterpretando totalmente la pregunta, por lo que tal vez esto esté muy lejos, pero me parece que la forma en que cuenta los vértices significa que la segunda pregunta necesariamente toma tiempo exponencial. Déjame explicarte: en tu último ejemplo, usas los mismos vértices varias veces. Parece fácil construir gráficos donde hay un número exponencial de ciclos únicos.
Joe Fitzsimons

Si su entrada es el polígono dado como en sus ejemplos, entonces es posible que la entrada sea exponencial en el número de vértices sin tener que repetir un ciclo. Si el gráfico contiene su gráfico de ejemplo (2 y 3) como un subgrafo, entonces tiene ciclos que no se cruzan y ciclos que se cruzan. Como resultado, debe leer la cadena completa para asegurarse de que no tiene ningún ciclo de cruce (que puede o no haber sido incluido). Esto lleva tiempo exponencial en en el peor de los casos. n
Joe Fitzsimons

1
@JoeFitzsimons: la entrada es solo una secuencia de puntos (es decir, pares de números reales), que no necesitan ser distintos. El tamaño de entrada es la longitud de esta secuencia, no el número de puntos únicos. n
Jeffε

2
@Kaveh: ¿Quizás demasiado abstracto / especializado? ¿Muchas palabras? Debería haber nombrado los puntos Ga, Ka, Naa, Taa, Tin, Khat ?
Jeffε

Respuestas:


2

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)abcdefbcefabde, 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)


1
"Seguir el subpath común es como mucho una operación de tiempo lineal ..." ¿Es esto cierto? Recuerde que las subrutas no son idénticas. Uno puede estar doblando hacia adelante y hacia atrás a lo largo de la imagen del otro. De hecho, ni siquiera está claro (para mí) cuando sabes que has terminado.
Pat Morin

Buen punto. ¿Sería posible, como paso de preprocesamiento, poner el polígono en algún tipo de forma estándar? Eludiríamos caminos que inmediatamente se pliegan sobre sí mismos, así como vértices que son colineales con sus vecinos inmediatos. Entonces, la oración que citó estaría mejor definida: el subpaso común consiste en bordes que tienen los mismos vértices, y sabe que ha terminado porque golpea diferentes vértices. Probar que la respuesta sigue siendo la misma en el polígono en forma estándar no debería ser demasiado difícil.
Chris Gray

@ ChrisGray: Tal vez, pero no tan fácilmente como has sugerido. Si la imagen de es un árbol, entonces eludir recursivamente todos los retrocesos eventualmente reduce a un solo punto. PPP
Jeffε

Sí, tienes razón, esa idea no funcionará. La cifra más a la derecha que dio arriba se reduciría a un solo punto.
Chris Gray

Tengo la intención de dejar que la recompensa expire; la mitad de los puntos se otorgarán automáticamente a esta respuesta.
Jeffε

2

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)=θ(pi1,pi,pi+1)pipi1pipipi+1πθiπnPpipi0θiπ-πPPpi=pi+1Turn(P)Turn(P)=±1P

Turn(P)=12πi=0n1θ(pi).
pipi es igual a . El ángulo externo en un espolón no está bien definido; podría ser o . En términos más generales, el número de giro de está bien definido si y solo si no tiene espuelas (y no tiene vértices repetidos ). No es difícil demostrar que es un número entero si está bien definido; en particular, si es un polígono simple.0θ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é siPprsrqr s spqrssrsrss

θ~(s)=πsgnθ(p,r,q)={πif θ(p,r,q)>0πif θ(p,r,q)<0
θ(p,r,q)=0? Como Pat observa, esto realmente puede suceder. Probablemente hay algún tipo de forma recursiva para definir incluso en este caso, pero no sé qué es).θ~(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 .PnP~Ps~P~PP~Ps~rsθ(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)PrsrrsPrs

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)piTurn~(P)=iθ~(pi)/2π=Turn(P~)±1P

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.rsΘ(n2)nΩ(n)Turn~(P)rsΘ(n2)nΩ(n)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.