Détection d’une collision
INTRODUCTION
Le problème général qui consiste à déterminer la présence ou non d'une région commune à
deux objets a plusieurs applications en infographie et en robotique par exemple. Un cas
particulier de ce problème consiste à déterminer l'appartenance d'un point à un objet.
Considérons plusieurs classes d'objets où le problème de l'appartenance d'un point se pose.
Détermination de l'appartenance d'un point à un polygone.
Le problème d'appartenance d'un point à un polygone est un problème de base en infographie.
On le rencontre lors de l'élimination des parties cachées, dans l'algorithme de tracé de rayons,
etc.
Ce problème se résout de plusieurs façons. Lorsque le polygone P est représenté par une liste
de sommets <s0, s1,..., sn-1>, on peut vérifier l'appartenance d'un point q à ce polygone en
utilisant le principe suivant:
Soit qi l'angle entre les segments de droite L[q, si] et L[q, si+1] si et si+1 sont deux
sommets consécutifs de P et i+1 est calculé modulo n.
(a) i=0
n-1 i= 2=> q P
(b) i=0
n-1 i= 0 => q P
201
q
s1
0
s
s6
s2
s5
s4
s3
P
(a) i=0
n-1 i= 2
s5
0
s
s1
s2
s3
s4
s6
q
P
(b) i=0
n-1 i= 0
Test d'appartenance d'un point à un polygone par la somme des angles
202
L'algorithme basé sur ce principe est le suivant:
bool Appartenance_point_Polygone (polygone P, point Q)
{ La fonction retourne vrai lorsque Q appartient à P et faux sinon. }
Somme 0.0
Pour i 0 à n-1 faire
Calculer i
Somme Somme + i
Si Somme = 2, alors retourner vrai
sinon retourner faux.
Pour calculer l'angle i, on utilise le produit scalaire des deux vecteurs
Q
,
i
t
Q
,
i
+
1
comme suit:
Soit deux vecteurs U et V.
L'angle de U à V peut se calculer de la façon suivante:
= arccos U · V
U V
U · V représente le produit scalaire de U et V:
U · V = xU xV + yU yV , et
| U | représente la norme du vecteur U (idem pour | V | ):
| U | = ( (xU)2 + (yU)2 )1/2
Cet algorithme s'exécute dans un temps O(n) si on interprète les fonctions angulaires comme
opérations d'ordre 1. Cependant, le calcul de fonctions trigonométriques inverses est un
problème en soi et prend un temps d'exécution d'ordre plus élevé que 1. Cet algorithme, malgré
sa simplicité, ne peut donc être qualifié d'efficace.
Une autre approche consiste à tracer une demi-droite partant du point q et coupant au moins
une arête de P mais sans passer par un de ses sommets. On compte ensuite le nombre
d'intersections de la demi-droite avec le contour du polygone. Si le nombre d'intersections est
impair, q P (voir la figure ci-dessous en (b)); sinon, q P (voir la figure ci-dessous en (a)).
203
qq
(a) (b)
Nombre d'intersections (a) pair, (b) impair.
L'algorithme basé sur cette approche s'exécute en temps linéaire. Il s'énonce comme suit:
bool Appartenance_point_Polygone (polygone P, point Q)
{ La fonction retourne vrai lorsque Q appartient à P et faux sinon. }
{ Cette étape permet de trouver un point r tel que la demi-droite D d'origine Q et passant par
r ne passe par aucun sommet du polygone. }
k 0
Recommence vrai { Recommence est vrai lorsque l'on doit reprendre cette étape. }
sn s0 { On duplique s0 }
Tant que Recommence
Si Q, sk et sk+1 sont colinéaires, alors k k + 1
r (sk + sk+1) / 2
i 0
Tant que i < n-1 et que Q, r et si+1 ne sont pas colinéaires, faire i i + 1
Si Q, r et si+1 sont colinéaires, alors k k + 1
sinon Recommence faux
{ Cette étape compte le nombre d'intersections entre D et les arêtes du polygone. }
Nb_intersections 1
Pour i 0 à n-1, faire
Si la demi-droite partant de Q et passant par r coupe l'arête L[si, si+1], alors
Nb_intersections Nb_intersections + 1
204
{ La fonction retourne vrai si le nombre d'intersections est impair; autrement, elle retourne
faux. }
Si (Nb_intersections modulo 2) = 1 alors retourner vrai
sinon retourner faux
Une autre méthode pour déterminer l'appartenance d'un point Q à un polygone P est basée sur
l'algorithme de Cohen et Sutherland pour le découpage d'un segment de droite par rapport à une
fenêtre polygonale. Cet algorithme nécessite cependant que la fenêtre polygonale soit convexe.
On doit donc effectuer un pré-traitement sur le polygone pour vérifier sa convexité, et le
subdiviser en parties convexes s'il est concave. On peut ensuite appliquer cette adaptation de
l'algorithme de Cohen et Sutherland sur les différentes parties convexes.
La première étape de l'algorithme de Cohen et Sutherland consiste à découper l'espace en
régions, en prolongeant les côtés du polygone. À chaque région est associé un code (0 ou 1) de
longueur n (où n correspond au nombre d'arêtes), indiquant si la région contient le polygone (0)
ou non (1). Comme on peut le voir à la figure suivante, l'intérieur du polygone a toujours le
code 0000. À l'aide de ces codes et d'un point de référence à l'intérieur du polygone, on peut
vérifier si un point quelconque se trouve dans la même région. Les différentes étapes sont les
suivantes:
1. Calculer les coordonnées d'un point de référence r situé à l'intérieur de P en calculant la
moyenne des coordonnées de deux sommets non consécutifs de P.
2. Déterminer les équations des droites de prolongement des arêtes du polygone de la façon
suivante:
Pour i = 0, 1,..., n-1,
y - yi
x - xi=yi+1 - yi
xi+1 - xi
ou encore,
y - yi- x - xi
yi+1 - yi
xi+1 - xi= 0
3. Reporter les coordonnées de r dans les équations des droites de prolongement pour
déterminer le signe de la région dans laquelle se trouve r, pour chaque droite considérée:
signei(r) = signe yr- yi- xr- xi
yi+1 - yi
xi+1 - xi
1 / 11 100%