Voici une solution en Java qui retourne vrai si un segment de ligne (les 4 premiers paramètres) coupe l'axe aligné rectangle (les 4 derniers paramètres). Il serait trivial de retour le point d'intersection au lieu d'un booléen. Il fonctionne en vérifiant d'abord si complètement à l'extérieur, d'autre à l'aide de l'équation de droite y=m*x+b
. Nous savons que les lignes qui composent le rectangle sont de l'axe aligné, de sorte que les contrôles sont faciles.
public boolean aabbContainsSegment (float x1, float y1, float x2, float y2, float minX, float minY, float maxX, float maxY) {
// Completely outside.
if ((x1 <= minX && x2 <= minX) || (y1 <= minY && y2 <= minY) || (x1 >= maxX && x2 >= maxX) || (y1 >= maxY && y2 >= maxY))
return false;
float m = (y2 - y1) / (x2 - x1);
float y = m * (minX - x1) + y1;
if (y > minY && y < maxY) return true;
y = m * (maxX - x1) + y1;
if (y > minY && y < maxY) return true;
float x = (minY - y1) / m + x1;
if (x > minX && x < maxX) return true;
x = (maxY - y1) / m + x1;
if (x > minX && x < maxX) return true;
return false;
}
Il est possible de raccourci si le début ou la fin d'un segment est à l'intérieur du rectangle, mais il est probablement mieux de faire le calcul, qui vous permettra de toujours retourner true si l'une ou les deux de fin de segment sont à l'intérieur. Si vous souhaitez créer un raccourci de toute façon, insérez le code ci-dessous après la "complètement en dehors de" vérifier.
// Start or end inside.
if ((x1 > minX && x1 < maxX && y1 > minY && y1 < maxY) || (x2 > minX && x2 < maxX && y2 > minY && y2 < maxY)) return true;