Présentation d'algorithmes permettant de contrôler l'intersection de deux objets géographiques

 

 

 

 

 

Au-delà de la seule consultation visuelle des données, l'intérêt d'une base de données géographique réside en grande partie dans la mise en œuvre d'analyses et de traitements (requêtes, jointures) de nature géographique, c'est à dire qui exploitent les relations géographiques entre objets.

 

De telles analyses reposent notamment sur la capacité à déterminer de manière automatique si deux objets graphiques géopositionnés présentent une intersection.

 

L'objet de ce document est de décrire quelques-uns des algorithmes théoriques (non optimisés) qui permettent de réaliser un tel contrôle.

 

Nous nous limitons, dans ce document, aux trois classes d'objets graphiques suivantes :

 

·         les points,

·         les polylignes

·         les polygones connexes.

 

 

 

Intersection point - point

 

Le contrôle de l'intersection de deux points (X1,Y1) et (X2,Y2) se ramène à la comparaison des valeurs numériques de leurs coordonnées. Les deux points vérifieront la relation d'intersection si et seulement si X1=X2 et Y1=Y2

 

 

Intersection point - segment de droite

 

Le contrôle de l'intersection d'un point (X,Y) et d'un segment de droite défini par les deux points (X1,Y1) et (X2,Y2) se ramène à la vérification des deux conditions suivantes :

 

i) X est compris dans l'intervalle X1, X2  (ou bien : Y est compris dans l'intervalle Y1, Y2)

ii) (X,Y) vérifie l'équation de la droite (X1,Y1)(X2,Y2)

 

 

Intersection point - polyligne

 

Une polyligne (ligne brisée) est définie par une liste de points. Le contrôle de l'intersection d'un point (X,Y) et d'une polyligne définie par les n points (X1,Y1), (X2,Y2),..(Xn,Yn) se ramène à vérifier successivement l'intersection entre le point (X,Y) et chacun des (n-1) segments de droite constituant la polyligne. L'itération s'arrête lorsqu'une intersection est détectée ou lorsque l'ensemble des segments ont été testés.

 

 

Intersection segment de droite- segment de droite

 

Deux segments de droite non parallèles définis par les points (X1,Y1), (X2,Y2) d'une part, (X3,Y3), (X4,Y4) d'autre part, ont un point d'intersection si et seulement si

 

i)   les deux droites définies par (X1,Y1), (X2,Y2)  et (X3,Y3), (X4,Y4)  ont un point en commun (X,Y)

ii)  X est compris dans l'intervalle X1, X2 (ou bien : Y est compris dans l'intervalle Y1, Y2)

iii) X est compris dans l'intervalle X3,X4 (ou bien : Y est compris dans l'intervalle Y3,Y4)

 

Deux segments de droite parallèles entreront en intersection si et seulement si :

 

i) les deux droites (X1,Y1), (X2,Y2)  et (X3,Y3), (X4,Y4) ont la même ordonnée à l'origine,

ii) les intervalles (X1,X2) et (X3,X4) ont une intersection non vide (ou : les intervalles (Y1,Y2) et (Y3,Y4) ont une intersection non vide)

 

 

Intersection polyligne - polyligne

 

Le contrôle de l'intersection entre deux polylignes se ramène à contrôler l'intersection de segments de droite en contrôlant un par un l'intersection de chacun des segments composant la première polyligne avec chacun des segments composant la deuxième polyligne. L'itération s'arrête si une intersection est détectée ou si la totalité du produit cartésien a été parcourue.

 

 

Intersection point - polygone connexe

 

L'algorithme de contrôle de l'intersection d'un point (X,Y) et d'un polygone connexe défini par n points (X1,Y1) (X2,Y2)..(Xn,Yn) est fondé sur un constat graphique préliminaire très simple :

Une demi-droite verticale issue d'un point intérieur à un polygone convexe rencontre le contour de celui-ci en un point (cf. fig.1)

 

Une demi-droite verticale issue d'un point extérieur à un polygone convexe rencontre le contour de celui-ci en zéro ou deux points (cf. fig.2)

 

 

La même opération appliquée à un polygone connexe mais non convexe semble mettre en évidence une règle plus générale : un point est intérieur (respectivement extérieur) à un polygone connexe si et seulement si la demi-droite verticale tirée à partir du point rencontre le contour du polygone en un nombre impair (respectivement pair) de points (cf. fig. 3).

 

 

En poursuivant la réflexion, on constate qu'il peut être difficile de compter le nombre de points d'intersection lorsque l'un des côtés du polygone est lui-même un segment vertical (cf. fig. 4). Le choix d'une demi-droite de pente distincte de chacune des pentes des côtés du polygone permet d'exclure cette possibilité.

 

 

De plus, on s'aperçoit rapidement que la règle que nous avons imaginée tombe en défaut dès lors qu'il existe au moins un point d'intersection "double" (c'est à dire un point d'intersection qui coïncide avec l'un des sommets du polygone) (cf. fig. 5).

Il convient donc de choisir une droite dont la pente sera distincte de chacune des pentes des côtés du polygone, et qui ne rencontrera aucun des sommets du polygones.

 

Cette précaution permet d'assurer un résultat correct.

 

Enfin, le cas de l'intersection du point avec l'un des côtés du polygone peut être écarté au départ, pour distinguer une intersection stricte d'une intersection avec le contour du polygone.

 

Ces éléments construits à partir d'une approche intuitive et à partir de constats visuels permettent de construire un algorithme efficace (mais qui est loin d'être le mieux optimisé pour un traitement informatique).

 

Nous décrivons ci-dessous l'algorithme que nous venons de définir :

 

Soit (X,Y) un point et { (X1,Y1) , (X2,Y2) , … , (Xn,Yn) } un polygone connexe à  n sommets (chacun des sommets est bien entendu distinct d'un autre).

Nous commençons par vérifier si (X,Y) appartient à l'un des segments (Xi,Yi), (Xi+1,Yi+1) auquel cas nous avons terminé.

Si ce n'est pas le cas, nous calculons et plaçons dans une liste les n-1 pentes des segments de droite (Xi,Yi), (Xi+1,Yi+1).

Nous calculons et ajoutons à la liste les n pentes des droites (X,Y) (Xi,Yi).

La liste que nous venons de constituer est triée par ordre croissant (ou décroissant), et nous définissons la pente p comme la moyenne arithmétique des deux premières pentes distinctes de la liste triée.

Le segment de droite S de pente p issu du point (X,Y) et dont l'autre extrémité a pour abscisse le nombre max{X1, X2, .., Xn} vérifie les conditions requises pour appliquer la règle mise en évidence.

A l'aide d'une itération, nous vérifions si le segment de droite S entre en intersection avec chacun des segments qui constituent le polygone, et incrémentons un compteur (initialement nul) dans ce cas.

 

Le test de parité de la valeur finale du compteur permet de conclure.

 

Intersection polyligne - polygone connexe

 

La vérification de l'intersection d'une polyligne et d'un polygone connexe se borne à vérifier en premier lieu si l'un des segments composant la polyligne a une intersection avec l'un des côtés du polygone (Fig. 6). Si ce n'est pas le cas, il convient alors de vérifier si l'un des noeuds de la polyligne est en intersection avec le polygone. A défaut, on conclut que la polyligne n'entre pas en intersection avec le polygone.

 

Intersection polygone connexe - polygone connexe

 

L'intersection entre un polygone connexe et un polygone connexe a lieu si l'un des côtés du premier polygone entre en intersection avec l'un des côtés du deuxième polygone, ou si l'un noeuds du premier polygone entre en intersection avec le deuxième polygone.

 

 

Auteur : Christophe Faivre Duboz

Date    : 21/11/2001

 

 

http://www.iag.asso.fr/