Trouver un moyen parmi les obstacles ronds

Navigation forestiĂšre


Un * Path Finder Algorithm est un outil puissant pour gĂ©nĂ©rer rapidement des chemins optimaux. Habituellement, A * est affichĂ© lors de la navigation dans les cartes Ă  partir des grilles, mais il peut ĂȘtre utilisĂ© non seulement pour les grilles! Il peut fonctionner avec n'importe quel graphique. Vous pouvez utiliser A * pour trouver votre chemin dans le monde des obstacles ronds.


Dans l' article original, toutes les images sont interactives.

Comment un algorithme résout-il ces deux problÚmes? Commençons par une brÚve description du fonctionnement d'A *.

Algorithme A *


L'algorithme A * trouve le chemin optimal du dĂ©but au point final, en Ă©vitant les obstacles en cours de route. Il s'en rend compte, Ă©largissant progressivement de nombreux chemins partiels . Chaque chemin partiel est une sĂ©rie d'Ă©tapes allant du point de dĂ©part Ă  un point intermĂ©diaire sur la route du but. Dans le processus de travail A *, les chemins partiels se rapprochent du point final. L'algorithme cesse de fonctionner lorsqu'il trouve le chemin complet, ce qui est meilleur que les options restantes, et cela peut ĂȘtre prouvĂ©.

À chaque Ă©tape de l'algorithme, A * Ă©value l'ensemble des chemins partiels et gĂ©nĂšre de nouveaux chemins, dĂ©veloppant le chemin le plus prometteur hors de l'ensemble. Pour ce faire, A * stocke les chemins partiels dans une file d'attente prioritaire, triĂ©s par longueur approximative - la vraie longueur de chemin mesurĂ©e plus la distance restante approximative jusqu'Ă  la cible. Cette approximation doit ĂȘtre sous-estimĂ©e ; c'est-Ă -dire que l'approximation peut ĂȘtre infĂ©rieure Ă  la vraie distance, mais pas supĂ©rieure Ă  celle-ci. Dans la plupart des tĂąches de recherche de chemin, une bonne estimation sous-estimĂ©e est la distance gĂ©omĂ©trique en ligne droite entre la fin du chemin partiel et le point final. Le vrai meilleur chemin vers le but depuis la fin du chemin partiel peut ĂȘtre plus long que cette distance en ligne droite, mais ne peut pas ĂȘtre plus court.

Lorsque A * dĂ©marre, la file d'attente prioritaire ne contient qu'un seul chemin partiel: le point de dĂ©part. L'algorithme supprime Ă  plusieurs reprises le chemin le plus prometteur de la file d'attente prioritaire, c'est-Ă -dire le chemin avec la plus petite longueur approximative. Si ce chemin se termine au point de terminaison, alors l'algorithme a terminĂ© la tĂąche - la file d'attente prioritaire garantit qu'aucun autre chemin ne peut ĂȘtre meilleur. Sinon, Ă  partir de la fin du chemin partiel qu'il a supprimĂ© de la file d'attente, A * gĂ©nĂšre plusieurs nouveaux chemins, faisant des pas unitaires dans toutes les directions possibles. Il remet ces nouveaux chemins dans la file d'attente prioritaire et recommence le processus.

Compter


A * fonctionne avec un graphe : un ensemble de nƓuds reliĂ©s par des arĂȘtes . Dans un monde basĂ© sur une grille, chaque nƓud dĂ©signe une cellule de maillage distincte, et chaque bord est une connexion aux cellules voisines au nord, au sud, Ă  l'est ou Ă  l'ouest.

Avant de pouvoir exĂ©cuter A * pour la forĂȘt Ă  partir d'obstacles ronds, nous devons le convertir en graphique. Tous les chemins Ă  travers la forĂȘt sont constituĂ©s de segments alternĂ©s de lignes et d'arcs. Ce sont les bords du graphique du chemin. Les extrĂ©mitĂ©s de ces bords deviennent des nƓuds.

Un chemin Ă  travers un graphique est une sĂ©rie de nƓuds reliĂ©s par des bords:


Les segments et les arcs sont tous deux des bords du graphique. Nous appellerons les segments les bords de transition , car le chemin les utilise pour se déplacer entre les obstacles. Nous appelons arcs les bords enveloppants , car leur tùche en cours de route est de contourner les cÎtés des obstacles.

Ensuite, nous explorerons un moyen simple de transformer une forĂȘt avec des obstacles en graphique: nous gĂ©nĂ©rerons toutes les arĂȘtes de transition et enveloppes possibles des arĂȘtes.


Transition Edge Generation


Les bords de la transition entre une paire de cercles sont des segments de ligne qui touchent à peine les deux cercles; ces segments sont appelés tangentes à deux points , et pour chaque paire de cercles, il y a quatre tangentes de ce type. Les tangentes à deux points qui se croisent entre les cercles sont appelées tangentes internes à deux points , et celles qui passent à l'extérieur sont appelées externes .

Tangentes intérieures à deux points


Dans le passĂ©, la recherche de tangentes internes Ă©tait importante pour calculer la longueur de la courroie reliant deux poulies de tailles diffĂ©rentes, de sorte que la tĂąche de crĂ©er des tangentes internes Ă  deux points s'appelle le problĂšme des courroies . Pour trouver les tangentes internes Ă  deux points, vous devez calculer l'angle  theta dans le dessin ci-dessous.


Il s'est avéré que, pour les cercles avec des centres A et B et rayons rA et rB dont les centres sont à distance d :

 theta= arccosrA+rB overd


DĂ©finition  theta on peut facilement trouver les points C , D , E et F .

Tangentes externes Ă  deux points


Lors de la construction de tangentes externes (c'est la tùche des poulies ), une technique similaire est utilisée.


Pour les tangentes externes, nous pouvons trouver  theta comme suit:

 theta= arccos lvertrA−rB rvert overd


Peu importe lequel des cercles est plus grand, A ou B, mais comme vous pouvez le voir sur l'image,  theta posĂ© sur le cĂŽtĂ© A le plus proche de B, mais sur le cĂŽtĂ© B le plus Ă©loignĂ© de A.

Ligne de vue


Pris ensemble, les tangentes internes et externes Ă  deux points entre les deux cercles forment les bords de la transition entre les cercles. Mais que se passe-t-il si un ou plusieurs bords de transition ferment le troisiĂšme cercle?


Si le bord de transition est chevauché par un autre cercle, alors nous devons éliminer ce bord. Pour reconnaßtre un tel cas, nous utilisons un calcul simple de la distance entre un point et une ligne . Si la distance entre le bord de transition et le centre de l'obstacle est inférieure au rayon de l'obstacle, alors l'obstacle chevauche le bord de transition, nous devons donc le jeter.

Pour calculer la distance d'un point C Ă  un segment de ligne droite  overlineAB nous utiliserons la mĂ©thode suivante :

Tout d'abord, nous calculons u - une partie de la distance le long du segment  overlineAB oĂč la perpendiculaire coupe le point C :

u=(C−A) cdot(B−A) over(B−A) cdot(B−A)


Ensuite, nous calculons la position E sur  overlineAB :

E=A+ mathrmclamp(u,0,1)∗(B−A)




La distance d de C couper  overlineAB La distance de C avant E :

d= |E−C |


Depuis d<r , le cercle chevauche la ligne de visĂ©e de A dans B et le bord doit ĂȘtre jetĂ©. Si d ger puis la ligne de vue de A dans B existe et la cĂŽte doit ĂȘtre laissĂ©e.

Génération d'enveloppe de bord


Les nƓuds du graphique relient le bord de transition au bord de l'enveloppe. Dans les sections prĂ©cĂ©dentes, nous avons gĂ©nĂ©rĂ© des arĂȘtes de transition. Pour gĂ©nĂ©rer les enveloppes des bords, nous partons du point final du bord de transition, faisons le tour du cercle et terminons au point final d'un autre bord de transition.


Pour trouver l'ensemble des enveloppes des bords d'un cercle, on trouve d'abord tous les bords de la transition qui sont tangents au cercle. Créez ensuite les enveloppes des bords entre tous les points d'extrémité des bords de transition sur le cercle.

Tout mettre ensemble


AprĂšs avoir gĂ©nĂ©rĂ© des arĂȘtes de transition, des enveloppes d'arĂȘtes et de nƓuds, puis Ă©liminĂ© toutes les arĂȘtes de transition qui se chevauchent, nous pouvons crĂ©er un graphique et commencer Ă  rechercher le chemin Ă  l'aide de l'algorithme A *.


Améliorations


La procĂ©dure de gĂ©nĂ©ration de graphe que nous avons examinĂ©e fonctionne assez bien pour expliquer l'algorithme, mais peut ĂȘtre amĂ©liorĂ©e Ă  bien des Ă©gards. De telles amĂ©liorations permettront Ă  l'algorithme de dĂ©penser moins de ressources CPU et mĂ©moire, ainsi que de gĂ©rer plus de situations. Regardons quelques-unes des situations.

Obstacles qui se concernent


Vous avez peut-ĂȘtre remarquĂ© que dans les exemples ci-dessus, les obstacles ronds ne se chevauchaient pas et ne se touchaient mĂȘme pas. En supposant que les cercles peuvent se toucher, cela complique la tĂąche de trouver le chemin

Tangentes Ă  deux points


Rappelons que les tangentes Ă  deux points peuvent ĂȘtre trouvĂ©es en utilisant cette formule pour les tangentes internes:

 theta= arccosrA+rB overd


et formules pour tangentes externes:

 theta= arccos lvertrA−rB rvert overd


Lorsque deux cercles se touchent ou se croisent, il n'y a pas de tangente interne entre eux. Dans ce cas rA+rB surd plus d'un. Étant donnĂ© que la valeur de l'arccosine est en dehors du domaine de la dĂ©finition [−1,1] non dĂ©fini, il est important de vĂ©rifier l'intersection des cercles avant de trouver l'arc cosinus.

De mĂȘme, si un cercle est complĂštement situĂ© dans un autre, il n'y aura pas de tangentes externes entre eux. Dans ce cas rA−rB surd hors de portĂ©e [−1,1] c'est-Ă -dire qu'il n'a pas d'arc cosinus.


Ligne de visibilité des bords de transition


Si nous autorisons la possibilité de toucher ou de franchir des obstacles, de nouveaux cas apparaissent dans les calculs de la ligne de visée des bords de transition.

Rappeler le calcul u - partie de la distance le long du bord de la transition Ă  laquelle la perpendiculaire au point touche le bord. Si toucher les cercles n'est pas autorisĂ©, la valeur u hors de portĂ©e [0,1] c'est-Ă -dire que le cercle ne peut pas toucher le bord, car pour cela il devrait toucher l'un des points d'extrĂ©mitĂ© du bord. Cela n'est pas possible car les extrĂ©mitĂ©s d'une arĂȘte sont dĂ©jĂ  tangentes Ă  d'autres cercles.

Cependant, si nous permettons la possibilitĂ© de cercles qui se chevauchent, les valeurs u hors de portĂ©e [0,1] peut chevaucher la ligne de visĂ©e le long du bord. Cela correspond aux cas oĂč le cercle est situĂ© au-delĂ  de l'extrĂ©mitĂ© du bord de transition, mais chevauche ou touche le point final. Pour suivre de tels cas mathĂ©matiquement, nous limiterons u intervalle [0,1] :

E=A+pince(u,0,1)∗(B−A)


Ligne de vue de l'enveloppe


Lorsque des obstacles peuvent se toucher ou se croiser, les enveloppes des bords peuvent ĂȘtre bloquĂ©es par des obstacles de la mĂȘme maniĂšre que les bords de transition. ConsidĂ©rez le bord de l'enveloppe de la figure ci-dessous. Si l'enveloppe de la cĂŽte touche un autre obstacle, la cĂŽte est bloquĂ©e et doit ĂȘtre jetĂ©e.


Pour dĂ©terminer si l'enveloppe du bord est bloquĂ©e par un autre obstacle, nous utilisons la mĂ©thode suivante pour dĂ©terminer les points d'intersection de deux cercles. Si les cercles ont des centres aux points A et B et rayons rA et rB oĂč d - distance entre A et B , pour commencer, nous devons vĂ©rifier plusieurs cas. Si les cercles ne se touchent pas (c.-Ă -d. d>rA+rB ),
sont l'un dans l'autre ( d<|rA−rB| ) ou match ( d=0 et rA=rB ), les cercles ne peuvent donc pas affecter les enveloppes des uns et des autres.

Si aucune de ces conditions n'est remplie, les cercles se coupent en deux points; si les cercles se touchent, alors ces deux points coïncident. Considérez l' axe radical reliant les points d'intersection; il est perpendiculaire à la ligne reliant A et B à un moment donné C . On peut calculer la distance a de A avant C comme suit:

a=r2A−r2B+d2 sur2d


Trouver a on peut trouver l'angle  theta :

 theta= arccosa overrA


Si  theta est nul, alors les cercles se touchent C . Sinon, il y a deux points d'intersection correspondant Ă  positif et nĂ©gatif  theta .


Ensuite, nous dĂ©terminons si l'un des points d'intersection se situe entre les points de dĂ©but et de fin de l'enveloppe de l'arĂȘte. Si c'est le cas, l'obstacle bloque le bord de l'enveloppe et nous devons jeter ce bord. Notez que nous n'avons pas besoin de considĂ©rer le cas oĂč l'enveloppe du bord est entiĂšrement Ă  l'intĂ©rieur de l'obstacle, car l'Ă©crĂȘtage le long de la ligne de visĂ©e pour les bords de transition a dĂ©jĂ  rejetĂ© ce bord.

AprÚs avoir modifié le calcul des tangentes à deux points et la ligne de visée des bords de transition et des enveloppes des bords, tout fonctionne correctement.

Rayon d'acteur variable et extension de Minkowski


Lors du calcul de la navigation d'un objet rond dans le monde des obstacles circulaires, on peut prendre en compte des observations qui simplifient la solution du problĂšme. Tout d'abord, on peut simplifier le travail en notant que le mouvement d'un cercle de rayon r Ă  travers la forĂȘt est similaire au mouvement d'un point Ă  travers la mĂȘme forĂȘt avec un seul changement: le rayon de chaque obstacle augmente de r . Il s'agit d'un cas extrĂȘmement simple d'application de la somme de Minkowski . Si le rayon de l'acteur est supĂ©rieur Ă  zĂ©ro, alors avant de commencer, nous augmentons simplement la taille des obstacles.

Génération de bords différés


En gĂ©nĂ©ral, un graphique pour une forĂȘt de n obstacles contient O(n2) bords de transition, mais comme chacun d'eux doit ĂȘtre vĂ©rifiĂ© pour la ligne de vue avec n obstacles, la durĂ©e totale de gĂ©nĂ©ration du graphe est O(n3) . De plus, des paires de bords de transition peuvent conduire Ă  la crĂ©ation de bords d'enveloppe, et chacun d'eux doit ĂȘtre vĂ©rifiĂ© avec chaque obstacle pour la ligne de visĂ©e. Cependant, en raison de la grande efficacitĂ© de l'algorithme A *, il ne regarde gĂ©nĂ©ralement qu'une partie de ce grand graphique pour crĂ©er le chemin optimal.

Nous pouvons gagner du temps en générant de petites parties du graphique à la volée pendant l'exécution de l'algorithme A *, plutÎt que de faire tout le travail à l'avance. Si A * trouve rapidement le chemin, nous ne générerons qu'une petite partie du graphique. Pour ce faire, nous déplaçons la génération de bord vers la fonction neighbors() .

Il y a plusieurs cas. Au début de l'algorithme, nous avons besoin de voisins du point de départ. Ce sont les bords de la transition du point de départ aux bords gauche et droit de chaque obstacle.

Le cas suivant est celui oĂč A * vient d'arriver au point p au bord d'un obstacle C le long du bord de transition: les neighbors() doivent renvoyer les enveloppes des bords menant de p . Pour ce faire, nous dĂ©terminons quelles arĂȘtes de transition sortent de l'obstacle en calculant les tangentes Ă  deux points entre C et tous les autres obstacles, en Ă©liminant tous ceux qui ne sont pas en vue. On retrouve ensuite toutes les enveloppes des bords se connectant p avec ces bords de transition, laissant tomber ceux qui sont bloquĂ©s par d'autres obstacles. Nous renvoyons toutes ces enveloppes des bords, en sauvegardant les bords de transition pour le retour dans un appel ultĂ©rieur aux neighbors() .

Le dernier cas est celui oĂč A * a contournĂ© le bord de l'enveloppe le long de l'obstacle C et il doit partir C le long du bord de la transition. Étant donnĂ© que l'Ă©tape prĂ©cĂ©dente a calculĂ© et enregistrĂ© toutes les arĂȘtes de transition, vous pouvez simplement rechercher et renvoyer l'ensemble d'arĂȘtes correct.

Nous coupons les enveloppes pointues des cĂŽtes


Les bords d'enveloppe relient les bords de transition touchant un cercle, mais il s'avÚre que bon nombre de ces bords d'enveloppe ne conviennent pas pour une utilisation optimale. Nous pouvons accélérer l'algorithme en les éliminant.

Le chemin optimal Ă  travers la forĂȘt d'obstacles consiste toujours Ă  alterner des bords de transition et des enveloppes de bords. Supposons que nous entrons dans un nƓud A et dĂ©cidez comment vous en sortir:


Connectez-vous via A signifie que nous allons dans le sens horaire (  circlearrowright ) Nous devons sortir par le nƓud, ce qui nous permet de continuer Ă  se dĂ©placer dans le sens horaire (  circlearrowright ), c'est-Ă -dire que nous ne pouvons sortir que par le nƓud B ou D . Si vous sortez par C puis une inflexion (  curlywedge ) des moyens qui ne seront jamais optimaux. Nous devons filtrer ces bords pointus.

Tout d'abord, notez que A * traite de toute façon chaque bord non orientĂ©. P longleftrightarrowQ comme deux bords orientĂ©s P longrightarrowQ et Q longrightarrowP . Nous pouvons en profiter en marquant les bords et les nƓuds avec une orientation.

  1. Noeuds P devenir des nƓuds avec une orientation - dans le sens horaire ( P circlearrowright ) ou dans le sens antihoraire ( P circlearrowleft ) flĂšches.
  2. Bords de transition non orientĂ©s P longleftrightarrowQ devenir des bords orientĂ©s P,p longrightarrowQ, hatq et Q,q longrightarrowP, hatp oĂč p et q Sont des orientations, et  chapeaux signifie la direction opposĂ©e x .
  3. Enveloppes cĂŽtelĂ©es non orientĂ©es P longleftrightarrowQ devenir des bords orientĂ©s P circlearrowright longrightarrowQ circlearrowright et P circlearrowleft longrightarrowQ circlearrowleft . C'est lĂ  que se produit le filtrage: nous n'activons pas P circlearrowright longrightarrowQ circlearrowleft et P circlearrowleft longrightarrowQ circlearrowright , car un changement de direction crĂ©e des plis (  curlywedge )

Dans notre circuit, le nƓud A se transformera en deux nƓuds, A circlearrowright et A circlearrowleft il a un front de transition entrant  longrightarrowA circlearrowright et bord de transition sortant A circlearrowleft longrightarrow . Si nous prenons la route A circlearrowright devrait alors sortir par le nƓud  circlearrowright qui sera soit un bord de transition B circlearrowright longrightarrow (Ă  travers le bord de l'enveloppe A circlearrowright longrightarrowB circlearrowright ), ou bord de transition D circlearrowright longrightarrow (Ă  travers le bord de l'enveloppe A circlearrowright longrightarrowD circlearrowright ) Nous ne pouvons pas sortir C circlearrowleft longrightarrow , car le sens de rotation va changer de cette façon, et nous avons filtrĂ© l'enveloppe du bord A circlearrowright longrightarrowC circlearrowleft .

En filtrant ces enveloppes pointues de bords du graphique, nous avons augmenté l'efficacité de l'algorithme.

Couper les bords qui se croisent


Des chemins partiels peuvent ĂȘtre coupĂ©s, dont les derniers bords de la transition coupent l'avant-dernier bord de la transition.

Obstacles polygonaux


Voir Game Programming Gems 2 , Chapter 3.10, Optimizing Points-of-Visibility Pathfinding, Ă©crit par Thomas Young. Ce chapitre traite de l'Ă©crĂȘtage des nƓuds, mais pas pour les cercles, mais pour les polygones.

Les références


Source: https://habr.com/ru/post/fr451642/


All Articles