Détection de deux types de polygones presque simples

22

Je m'intéresse à la complexité de décider si un polygone non simple donné est presque simple, dans l'un ou l'autre de deux sens formels différents: faiblement simple ou non auto-croisant . Étant donné que ces termes ne sont pas largement connus, permettez-moi de commencer par quelques définitions.

  • Un polygone est le cycle fermé de segments de ligne reliant une séquence finie de points dans le plan. Les points sont appelés les sommets du polygone, et les segments sont appelés ses arêtes . Nous pouvons spécifier n'importe quel polygone en listant simplement ses sommets dans l'ordre.Pp0,p1,p2,,pn1pipipi+1modn

  • Un polygone est simple si tous les n sommets sont distincts et si les arêtes ne se coupent qu'à leurs extrémités. De manière équivalente, un polygone est simple s'il est homéomorphe à un cercle et que chaque arête a une longueur positive. En général, cependant, les sommets et les bords d'un polygone peuvent se croiser arbitrairement, voire coïncider. 1

  • Considérons deux chemins polygonaux A et B dont l'intersection est un sous-chemin commun des deux (éventuellement un seul point). Nous disons que A et B croix si leurs points d' extrémité A(0),B(0),A(1),B(1) autre à la limite d'un quartier de la commune subpath AB . Un polygone est auto-croisant s'il a deux sous- chemins de croisement et non auto-traversant sinon. 2

  • Un polygone est faiblement simple s'il est la limite d'une séquence de polygones simples, ou de manière équivalente, s'il existe une perturbation arbitrairement petite des sommets qui rend le polygone simple. Chaque polygone faiblement simple ne se traverse pas automatiquement; cependant, certains polygones non auto-croisants ne sont pas très simples.

Par exemple, considérons les six points a,b,p,q,x,y indiqués ci-dessous.

entrez la description de l'image ici

  • Le polygone abpqyz est simple; voir la figure de gauche.

  • Le polygone papbpqyqzq est faiblement simple; la figure du milieu montre un polygone simple à proximité. Cependant, ce polygone n'est pas simple, car il visite p trois fois.

  • Le polygone est auto-croisant, car les sous-chemins et croisent. Voir la bonne figure pour une certaine intuition.b p q z y q p apapbpqzqyqbpqzyqpa

  • Enfin, le polygone (qui s'enroule deux fois autour du polygone du milieu) n'est pas auto-traversant, mais il n'est pas faiblement simple. Intuitivement, le nombre de tours de ce polygone est , tandis que le nombre de tours de tout polygone simple doit être . (Une preuve formelle nécessite une analyse de cas, en partie parce que le nombre de tours n'est pas réellement bien défini pour les polygones avec des angles de !)papbpqyqzqpapbpqyqzq± 1 0 ±2±10

Mise à jour (13 septembre): Dans la figure ci-dessous, le polygone n'est pas auto-traversant et a le virage numéro 1 , mais ce n'est pas faiblement simple. Le polygone a sans doute plusieurs sous-passerelles non simples qui traversent , mais il n'a pas de sous-chemins simples qui traversent . (Je dis "sans doute" car on ne sait pas comment définir quand deux promenades non simples se croisent!)abcabcxyzxpqrxzyx

entrez la description de l'image ici

Alors enfin, voici mes vraies questions:

  • Combien de temps peut-on déterminer si un polygone donné ne se traverse pas?

  • Combien de temps peut-on déterminer si un polygone donné est faiblement simple?

Le premier problème peut être résolu en temps comme suit. Puisqu'il y a sommets, il y a sous-chemins de sommet à sommet; nous pouvons tester si un sous-chemin particulier est simple en temps (par force brute). Pour chaque paire de sous-chemins simples de sommet à sommet, nous pouvons tester s'ils se croisent en temps . Mais cela ne peut pas être le meilleur algorithme possible.n O ( n 2 ) O ( n 2O(n5)nO(n2)O ( n )O(n2)O(n)

Je ne sais pas si le deuxième problème peut être résolu en temps polynomial. Je pense que je peux calculer rapidement un nombre de virages bien défini pour tout polygone non simple (à moins que l'union des bords du polygone ne soit qu'un chemin, auquel cas le polygone doit être faiblement simple); voir ma réponse ci-dessous. Cependant, le nouvel exemple de polygone ci-dessus implique que le non-croisement et le virage numéro 1 n'impliquent pas une simplicité faible.

Nous pouvons déterminer si un polygone donné est simple , en temps en vérifiant chaque paire de bords pour intersection, ou temps en utilisant un algorithme standard de sweepline, ou même dans temps en utilisant l'algorithme de triangulation de Chazelle. (Si le polygone d'entrée n'est pas simple, tout algorithme de triangulation lèvera une exception, une boucle infinie ou produira une sortie qui n'est pas une triangulation valide.) Mais aucun de ces algorithmes ne résout les problèmes que je pose. O ( n log n ) O ( n )O(n2)O(nlogn)O(n)


1 Branko Grünbaum. Polygones: Meister avait raison et Poinsot avait tort mais a prévalu . Beiträge zur Algebra und Geometrie 53 (1): 57–71, 2012.

2 Voir, par exemple: Erik D. Demaine et Joseph O'Rourke. Algorithmes de pliage géométriques: liaisons, origami, polyèdres . Cambridge University Press, 2007.

Jeffε
la source
Je ne comprends pas pourquoi on voterait contre cette question?!
Kaveh
Je comprends peut-être totalement la question, et c'est peut-être loin, mais il me semble que la façon dont vous comptez les sommets signifie que la deuxième question prend nécessairement un temps exponentiel. Je m'explique: dans votre dernier exemple, vous utilisez plusieurs fois les mêmes sommets. Il semble facile de construire des graphiques où il existe un nombre exponentiel de cycles uniques.
Joe Fitzsimons
Si votre entrée est le polygone donné comme dans vos exemples, il est possible que l'entrée soit exponentielle en nombre de sommets sans jamais répéter un cycle. Si le graphique contient votre exemple de graphique (2 et 3) en tant que sous-graphique, alors il a des cycles qui ne se croisent pas et des cycles qui se croisent. Par conséquent, vous devez lire la chaîne entière pour vous assurer de ne pas avoir de cycles de croisement (qui peuvent ou non avoir été inclus). Cela prend un temps exponentiel en dans le pire des cas. n
Joe Fitzsimons
1
@JoeFitzsimons: L'entrée n'est qu'une séquence de points (c'est-à-dire des paires de nombres réels), qui n'ont pas besoin d'être distincts. La taille d'entrée est la longueur de cette séquence, pas le nombre de points uniques. n
Jeffε
2
@Kaveh: Peut-être trop abstrait / spécialisé? Trop de mots? J'aurais dû nommer les points Ga, Ka, Naa, Taa, Tin, Khat ?
Jeffε

Réponses:

2

Il semble que la première question ait un algorithme (bien que ce ne soit probablement pas optimal non plus). En supposant qu'il y ait un croisement, la clé pour le trouver semble être que les bords qui doivent être trouvés sont ceux immédiatement de chaque côté du sous-chemin commun. Par conséquent, nous examinons toutes les paires de paires d'arêtes consécutives. Il y en a un nombre quadratique. Si nous trouvons une paire de paires d'arêtes avec des sommets et tels que les arêtes et sont les mêmes, alors nous suivons le sous-chemin commun jusqu'à la fin et inspectons les arêtes qui le quittent. S'ils forment un croisement avec etO(n3)d e f b c e fabcdefbcefd e O ( n 3 )abde, alors nous avons terminé, sinon nous passons à la paire suivante. Suivre le sous-chemin commun est tout au plus une opération en temps linéaire, donc tout l'algorithme est .O(n3)

Cette analyse n'est probablement pas serrée car le nombre de fois qu'un sous-chemin commun de longueur linéaire sera suivi n'est pas linéaire dans le nombre de paires de paires. Il ne devrait y en avoir qu'un nombre constant. De même, si la longueur du sous-chemin commun le plus long est constante, alors nous sommes d'accord en termes de temps qui suit les sous-chemins communs. Je m'attends à ce que le pire des cas se présente lorsqu'il existe un seul sous-chemin de longueur commun aux sous- chemins . Ensuite, il y a interactions et dans chaque interaction bords sont suivis. Donc même encore, le nombre d'arêtes suivies estO(O(n)O ( n ) O ( O(n)O(n)o(n2)O(n2O(n)o(n2)et la limite est fournie par le nombre de paires. Ainsi, je suppose que la vraie limite de cet algorithme est .O(n2)

Chris Gray
la source
1
"Suivre le sous-chemin commun est tout au plus une opération en temps linéaire ..." Est-ce vrai? N'oubliez pas que les sous-chemins ne sont pas identiques. L'un peut se replier d'avant en arrière le long de l'image de l'autre. En fait, ce n'est même pas clair (pour moi) quand vous savez que vous avez terminé.
Pat Morin
Bon point. Serait-il possible, comme étape de prétraitement, de mettre le polygone sous une forme standard? Nous élirions des chemins qui se replient immédiatement sur eux-mêmes, ainsi que des sommets colinéaires avec leurs voisins immédiats. Ensuite, la phrase que vous avez citée serait mieux définie - le sous-chemin commun se compose d'arêtes qui ont les mêmes sommets, et vous savez que vous avez terminé parce que vous frappez des sommets différents. Prouver que la réponse reste la même dans le polygone sous forme standard ne devrait pas être trop difficile.
Chris Gray
@ChrisGray: Peut-être, mais pas aussi facilement que vous l'avez suggéré. Si l'image de est un arbre, éluder récursivement tous les lacets réduit finalement à un seul point. PPP
Jeffε
Oui, vous avez raison, cette idée ne fonctionnera pas. Le chiffre le plus à droite que vous avez donné ci-dessus serait réduit à un seul point.
Chris Gray
Je prévois de laisser la prime expirer; la moitié des points seront automatiquement attribués à cette réponse.
Jeffε
2

À la suggestion de Pat Morin, voici mon idée pour calculer le nombre de tours. Désolé si c'est un peu bâclé; Je lutte toujours contre les démons de la notation. De plus, le commentaire de Pat à la réponse de Chris révèle que j'ai ignoré certains cas dégénérés importants. Mais je posterai cela ici de toute façon au cas où d'autres le trouveraient utile.

Pour tout indice , soit dénotent l' angle externe signé au sommet ; il s'agit de l'angle dans le sens antihoraire entre les rayons et , normalisés dans la plage . (Toute l'arithmétique d'index est implicitement mod .) Le nombre de de est défini comme Permettez-moi d'appeler un sommet un éperon si l' angle interne àiθ(pi)=θ(pi1,pi,pi+1)pipi1pipipi+1πθiπnPpi

Turn(P)=12πi=0n1θ(pi).
pipi est égal à . L'angle externe à un éperon n'est pas bien défini; il peut s'agir de ou . Plus généralement, le nombre de de est bien défini si et seulement si n'a pas d'éperons (et pas de sommets répétés ). Il n'est pas difficile de prouver que est un entier s'il est bien défini; en particulier, si est un simple polygone.θ i π - π P P p i = p i + 1 T u r n ( P ) T0θiππPPpi=pi+1Turn(P)Turn(P)=±1P

Supposons maintenant que contienne une marche de la forme , où et le chemin est l'inversion du chemin . Alors est un éperon; appeler la racine de . Dans ce cas, permettez-moi de définir l'angle externe à comme suit: (Mais que faire sip r s r q p q r s s r sPprsrqpqrssrsrss

θ~(s)=πsgnθ(p,r,q)={πif θ(p,r,q)>0πif θ(p,r,q)<0
θ(p,r,q)=0? Comme l'observe Pat, cela peut réellement se produire. Il y a probablement une sorte de manière récursive pour définir même dans ce cas, mais je ne sais pas ce que c'est.)θ~(s)

Si est faiblement simple, alors il existe un simple -gon arbitrairement proche de ; tet être le sommet de le plus proche de . Lorsque s'approche de , l'angle interne à s'approche de zéro. Il n'est pas difficile de prouver (par induction sur la longueur de ) que l'angle externe approche .n ˜ P P ˜ s ˜PnP~Ps~P~PP~Ps~rsθ(s~)θ~(s)

Si consiste entièrement en une marche suivie de son inversion, , alors les angles externes aux éperons et sont toujours pas bien définis. Mais dans ce cas, je crois que est faiblement simple si et seulement si la marche n'est pas auto-croisante. (Il y a des cas plus complexes où je ne peux pas définir un nombre de virages modifié raisonnable, en particulier, si le polygone se déplace d'avant en arrière au cours d'une seule marche. Mais dans tous ces cas, il semble que le polygone soit faiblement simple si et seulement s'il ne se traverse pas automatiquement.)PrsrrsPrs

Sinon, si nous définissons pour tout sommet non , nous avons maintenant un numéro de virage bien défini , qui doit être si est faiblement simple.piθ~(pi)=θ(pi)pi± 1 PTurn~(P)=iθ~(pi)/2π=Turn(P~)±1P

Je ne suis plus sûr que puisse être calculé en temps linéaire. La principale difficulté est que la marche peut elle-même contenir des éperons. L'algorithme naïf qui trouve la racine de chaque éperon par force brute prend en fait le temps dans le pire des cas; considérons un -gon qui a un sous-sol de longueur qui alterne simplement entre deux points.rsΘ(n2)nΩ(n)Turn~(P)rsΘ(n2)nΩ(n)

Jeffε
la source