La méthode standard serait de faire la séparation de test de l'axe (faire une recherche google sur que).
En bref:
- Deux objets ne se coupent si vous pouvez trouver une ligne qui sépare les deux objets. par exemple, les objets / tous les points d'un objet sont sur des côtés différents de la ligne.
La chose amusante est, qu'il est suffisant de simplement vérifier tous les bords des deux rectangles. Si les rectangles ne se chevauchent pas l'un des bords seront à la séparation de l'axe.
En 2D, vous pouvez le faire sans l'aide de pentes. Un bord est simplement défini comme la différence entre les deux sommets, par exemple
edge = v(n) - v(n-1)
Vous pouvez obtenir une perpendiculaire à cette par la rotation de 90°. En 2D, c'est facile:
rotated.x = -unrotated.y
rotated.y = unrotated.x
Donc pas de trigonométrie ou des pentes impliqués. Normaliser le vecteur unité de longueur n'est pas nécessaire non plus.
Si vous voulez tester si un point est sur l'un ou l'autre côté de la ligne, vous pouvez simplement utiliser le produit scalaire. le panneau vous indiquera de quel côté vous êtes sur:
// rotated: your rotated edge
// v(n-1) any point from the edge.
// testpoint: the point you want to find out which side it's on.
side = sign (rotated.x * (testpoint.x - v(n-1).x) +
rotated.y * (testpoint.y - v(n-1).y);
Maintenant tester tous les points d'Un rectangle contre les bords du rectangle B et vice versa. Si vous trouvez une séparation de bord, les objets ne coupe pas (en fournissant tous les autres points de B sont de l'autre côté de l'arête en cours d'essai pour voir dessin ci-dessous). Si vous ne trouvez pas de séparation de bord, soit les rectangles sont sécantes ou un rectangle est contenue dans l'autre.
Le test fonctionne avec tous les polygones convexes btw..
Modification: Pour identifier une séparation de bord, il ne suffit pas de tester tous les points d'un rectangle à l'encontre de chaque bord de l'autre. Les candidat-E (ci-dessous), en tant que telle être identifié comme une séparation de bord, car tous les points sont dans le même demi-plan de E. Cependant, il n'est pas une séparation de bord, car les sommets Vb1 et Vb2 de B sont aussi dans ce demi-plan. Il aurait seulement été une séparation de bord si ce n'avait pas été le cas