Table des matières

Distance minimale entre deux polygones convexes

1. Introduction

Soient deux polygones A et B, convexes et disjoints. Un point appartient à un polygone s'il appartient à un de ses côtés, sommet inclu. On recherche le point P(A) appartenant à A et le point P(B) appartenant à B tels que la distance entre ces deux points soit minimale. La figure suivante montre les trois cas possibles :

pairesMin.svgFigure pleine page

Dans le premier cas, les deux points sont deux sommets : P(A)=A4 et P(B)=B2.

Dans le deuxième cas, l'un des point est un sommet alors que l'autre appartient à un côté.

Dans le troisième cas (cas dégénéré), il y a deux côtés parallèles et il existe une infinité de paires de points possédant la distance minimale.

Une application de ce problème est la détection des collisions dans la simulation du mouvement des solides à deux dimensions. Son extension à trois dimensions (distance minimale entre deux polyèdres), permet de traiter la détection de collision dans le cas général. Les trois cas ci-dessus peuvent d'ailleurs représenter deux solides à différents instants de leur mouvement. Dans une simulation de ce type, on calcule la distance minimale entre les deux solides à chaque pas de temps et la collision est détectée lorsque cette distance devient inférieure à un seuil très petit. Comme le calcul doit être fait fréquemment, il faut un algorithme efficace pour déterminer la paire de points de distance minimale.

On appelle élément du polygone soit un de ses sommets soit un de ses côtés. Par exemple un carré a 8 éléments (4 côtés et 4 sommets).

Un algorithme naif consisterait à tester toutes les paires d'éléments entre les deux polygones, à déterminer leur distance, et à retenir la paire présentant la distance minimale. Cet algorithme a une complexité en N2.

Ce document présente un algorithme de complexité N, qui repose sur l'utilisation des régions de Voronoi. Lorsqu'on suit le mouvement de deux polygones convexes, les points A(P) et B(P) se déplacent continûment sur le polygone. En appliquant l'algorithme à deux positions très voisines, le temps de calcul est en fait indépendant de la taille des polygones.

2. Régions de Voronoi et points les plus proches

On définit la distance d'un point M à un élément (sommet ou côté) comme la distance entre ce point et le point de l'élément qui lui est le plus proche. La distance entre un point M et un côté est donc la distance entre ce point est le point du côté qui lui est le plus proche. Pour déterminer ce point le plus proche, on considère la projection orthogonale (point I) de M sur la droite contenant le côté. La figure suivante montre les deux cas possibles :

distancePointsCote.svgFigure pleine page

Si le point I appartient au côté alors I est le point le plus proche et la distance est d=MI. Si le point I n'appartient pas au côté alors le point le plus proche est le sommet situé le plus proche de I. Sur la figure d=MA1.

La région de Voronoi d'un élément (sommet ou côté) est l'ensemble des points du plan situés hors du polygone dont la distance à l'élément est inférieure ou égale aux distances à tous les autres éléments.

La figure suivante montre un polygone avec les régions de Voronoi de ses sommets et de ses côtés.

voronoi.svgFigure pleine page

La région de Voronoi d'un sommet, par exemple A2 que l'on notera V(A2), est l'ensemble des points dont la distance à ce sommet est inférieure ou égale aux distances à tous les autres éléments du polygone. Cette région est délimitée par deux demi-droites passant par le sommet : la demi-droite D(A2A1) perpendiculaire au côté A2A1 et la demi-droite D(A2A3) perpendiculaire côté A2A3. La région de Voronoi du côté A2A3 est délimitée par les demi-droites D(A2A3) et D(A3A2) (qui sont parallèles). La région de Voronoi d'un sommet est l'intersection de deux demi-plan définis par ces deux droites.

Pour savoir si un point M appartient à une région de Voronoi d'un sommet, il suffit de tester de quel côté des deux droites il se situe. Cela se fait en calculant deux produits scalaires. Par exemple, M appartient à V(A2) si et seulement si :

A2MA2A10(1)A2MA2A30(2)

On remarque que les deux droites font partie de la région de Voronoi du sommet.

Pour savoir si un point M appartient à la région de Voronoi d'un côté, il faut savoir de quel côté se trouve l'extérieur du polygone. Pour cela, on adopte une convention sur le sens de parcours du polygone : le polygone est défini dans le sens horaire et l'extérieur se trouve à gauche du segment parcouru dans le sens croissant. On peut alors aisément calculer un vecteur normal dans le sens sortant (pas nécessairement unitaire). Le point M se trouve dans la région de Voronoi du segment A2A3 s'il est dans l'intersection des trois demi-plans définis par le côté et les deux droites D(A2A3) et D(A3A2). La condition s'écrit :

A2MA2A3>0(3)A3MA3A2>0(4)A2M>0n23(5)

Les régions de Voronoi permettent de simplifier la recherche des deux points de distance minimale. Pour voir comment, considérons les régions de Voronoi des deux éléments contenant ces deux points :

pairesMinVoronoi.svgFigure pleine page

Soient P(A) et P(B) les points les plus proches des deux polygones. Soit E(P(A)) l'élément auquel P(A) appartient (sommet si c'est sommet ou côté sinon), et E(P(B)) l'élément auquel P(B) appartient. Ces deux points sont les points les plus proches des deux éléments qui les contiennent. Si l'on met à part le cas dégénéré, on remarque que P(A) appartient à la région de Voronoi de E(P(B)) et que P(B) appartient à la région de Voronoi de E(P(A)). La réciproque est aussi vraie et constitue le théorème suivant :

Théorème : si P(A) et P(B) sont les deux points les plus proches de deux éléments E(P(A)) et E(P(B)), et si chacun de ces points appartient à la région de Voronoi de l'élément qui contient l'autre point, alors ces deux points sont les plus proches des deux polygones.

Par exemple sur le deuxième cas de la figure ci-dessus, P(A)=A4 appartient à la région de Voronoi de B2B3 et le point P(B) de B2B3 le plus proche de A4 appartient à la région de Voronoi de A4. D'après le théorème, cela suffit à affirmer que P(A) et P(B) sont les deux points les plus proches des deux polygones.

La recherche des deux points les plus proches se ramène donc à la recherche de deux éléments vérifiant la condition du théorème, c'est-à-dire dont les points les plus proches sont chacun dans la région de Voronoi de l'élément contenant l'autre point.

3. Algorithme de Lin-Canny

3.a. Algorithme

L'algorithme de Lin-Canny ([1]) permet de calculer la distance entre deux polyèdres dans un espace à trois dimensions. Lorsque les polyèdres se déplacent, l'algorithme permet de suivre les deux points les plus proches avec un temps de calcul constant pour chaque pas de temps (c'est-à-dire indépendant de la taille des polyèdres).

On considère ici une version simplifiée pour le problème à deux dimensions.

Cet algorithme consiste à rechercher les deux éléments EA et EB des polygones A et B vérifiant la condition suivante : les points P(A) et P(B) les plus proches de ces deux éléments vérifient P(A)V(EB) et P(B)V(EA)

Pour cela, l'algorithme démarre par une paire d'éléments (EA,EB) choisie arbitrairement. Dans le cas d'une simulation de mouvement de solides, cette paire est celle ayant été obtenue au pas de temps précédent, dans laquelle les points les plus proches étaient situés.

Pour une paire (EA,EB), on recherche tout d'abord les points P(EA)EA et P(EB)EB les plus proches de ces deux éléments (voir paragraphe suivant). On exclue pour l'instant le cas de deux côtés parallèles (cas dégénéré). On teste l'appartenance de chacun de ces points à la région de Voronoi de l'élément auquel appartient l'autre point, c'est-à-dire les deux conditions suivantes :

(a)P(EB)V(EA)(6)(b)P(EA)V(EB)(7)

Si les deux conditions (a) et (b) sont remplies alors les points P(EA) et P(EB) sont les deux points les plus proches des deux polygones et la recherche est terminée.

Si l'une au moins des deux conditions (a) et (b) n'est pas vérifiée, il faut poursuivre la recherche en choisissant une nouvelle paire. Supposons que la condition (a) ne soit pas vérifiée (soit (b) est vérifiée, soit (b) ne l'est pas mais (a) est la première testée). Il faut alors remplacer EA par un de ses deux éléments voisins (un sommet a deux côtés voisins et un côté a deux sommets voisins). Ce remplacement soit se faire pour que la distance entre les deux éléments diminue ou reste constante.

Considérons les deux différents cas possibles.

Premier cas : EA est un sommet, noté A2 sur la figure ci-dessous :

sommet.svgFigure pleine page

Le point P=P(EB) n'est pas dans la région de Volonoi du point A2 car :

A2PA2A3>0(8)

Le point P n'est pas dans le demi-plan défini par D(A2A3). Il faut alors remplacer A2 par A2A3, pour que le nouvel élément de A se rapproche de P.

La première condition non vérifiée rencontrée impose la direction du déplacement, même si la seconde n'est pas non plus vérifiée.

Si le point appartient P appartient à la région de Voronoi de A2 (les deux conditions sont satisfaites), alors on doit tester l'appartenance du point A2 à la région de Voronoi de l'élément EB contenant le point P(EB).

Second cas : EA est un côté, le côté A2A3 sur la figure ci-dessous :

cote.svgFigure pleine page

Le point P=P(EB) n'est pas dans la région de Volonoi du côté A2A3 car un des trois conditions n'est pas vérifiée :

A3PA3A20(9)

On doit alors remplacer le côté par le sommet A2.

Que doit-on faire si le point P n'appartient pas au demi-plan défini par le côté A2A3 (demi-plan extérieur au polygone) ? Voici un exemple de ce cas :

cote2.svgFigure pleine page

3.b. Détermination des points les plus proches de deux éléments

Voyons à présent comment se fait la recherche des points les plus proches de deux éléments.

Si les deux éléments sont des sommets, le résultat est trivial : les points les plus proches sont les sommets eux-mêmes.

Si l'un des éléments B1 est un sommet et l'autre un côté A1A2 , le point le plus proche appartenant au côté est déterminé en considérant la projection orthogonale I du sommet sur la droite contenant le côté.

minPointsCote.svgFigure pleine page

Pour déterminer le point I, considérons la forme paramétrée suivante vérifiée par tout point de la droite A1A2 :

OI=(1-λ)OA1+λOA2(10)

Comme de plus la droite IB1 doit être perpendiculaire à A1A2 on a :

B1IA1A2=0(11)

Ces deux équations conduisent à une équation du premier degré pour λ. Si 0<λ<1 alors le point le plus proche est le point I. Si λ0 alors le point le plus proche est A1. Si λ1 alors le point le plus proche est A2.

Le dernier cas à considérer est celui où les deux éléments sont des côtés. Les deux côtés sont supposés non parallèles et ne se coupent pas. La figure suivante montre un exemple :

minCoteCote.svgFigure pleine page

Sur cet exemple, les points les plus proches sont B1 et P(EA), son projeté orthogonal sur le segment A1A2.

Voici un autre exemple, où les deux points les plus proches sont des sommets :

minCoteCote2.svgFigure pleine page

Supposons que le point P(EA) ne soit pas sur une extrémité du segment, c'est-à-dire confondu ni avec A1, ni avec A2. La droite P(EA)P(EB) est alors nécessairement perpendiculaire au segment A1A2, car sinon il y aurait un point du segment plus proche de P(EB) que P(EA). Il s'en suit que si les deux segments ne sont pas parallèles, il est impossible que les deux points les plus proches soient tous les deux sur le segment (à l'exclusion des sommets). On en déduit qu'au moins l'un des points P(EA) et P(EB) est un sommet. Il faut tout d'abord rechercher les projections orthogonales des 4 sommets qui sont sur le segment de l'autre élément (méthode vue ci-dessus). Pour ces projections, on calcule aussi la distance et on garde la paire qui a la plus petite distance. On doit aussi prévoir le cas où les deux points sont des sommets. Il faut donc aussi comparer les distances pour les 4 paires de sommets. On garde finalement la paire de points qui a la plus petite distance.

3.c. Exemple

Voici un exemple de déroulement de l'algorithme. Pour chaque phase, les deux éléments testés sont marqués en couleur avec leur région de Voronoi.

LinCanny.svgFigure pleine page

On commence par la paire (A1,B1). Par convention, on commence par faire le test sur le point A1. On constate qu'il ne vérifie par la condition d'appartenance à V(B1) pour la droite D(B1B2). On remplace donc B1 par le côté B1B2.

Les points les plus proches des éléments A1 et B1B2 sont A1 et B2. Le point A1 ne vérifie par la condition d'appartenance à la région de Voronoi de B1B2 pour la droite D(B2B1). On doit donc remplacer l'élément B1B2 par le sommet B2.

Le point A1 appartient à la région de Voronoi de B2. Le point B2 ne vérifie par la condition d'appartenance à la région de Voronoi de A1 pour la droite D(A1A4). On doit donc remplacer l'élément A1 par le côté (A1A4).

Pour cette nouvelle paire d'éléments, les points les plus proches sont A4 et B2. A4 appartient à la région de Voronoi de B2. B2 ne vérifie par la condition d'appartenance à la région de Voronoi de A1A4 pour la droite D(A4A1). On doit donc remplacer A1A4 par A4.

Pour cette nouvelle paire, A4 est dans la région de Voronoi de B2 et B2 est dans la région de Voronoi de A4. Les deux points les plus proches des polygones sont donc A4 et B2.

Si les deux polygones se déplacent légèrement (translation et/ou rotation) à partir de cette position, on reprend la recherche à partir de la paire (A4,B2). Pour un déplacement assez faible, cette paire vérifie toujours la condition, puis un des points sort de la région de Voronoi de l'autre. Le nouvel élément de remplacement contient probablement le nouveau point le plus proche de l'autre. Si les déplacements sont assez petits, la recherche se fait donc à temps constant.

Références
[1]  M.C. Lin, J.F. Canny,  A fast algorithm for incremental distance calculation,  (Proceedings of the 1991 IEEEE Internatial Conference on Robotics and Automation, 1991)
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.