Vous pouvez utiliser le théorème de l'axe de séparation pour cela. Fondamentalement, si 2 polygones convexes (par exemple des rectangles) ne se coupent pas, alors il devrait y avoir au moins une ligne (formée par les bords de l'un des polygones étendus à l'infini) où tous les coins d'un polygone sont d'un côté et tous les coins de l'autre polygone sont de l'autre côté.
Vous pouvez tester le côté d'une ligne sur lequel pointe un point à l'aide d'un produit scalaire. Un vecteur devrait être la normale à la ligne, et l'autre vecteur devrait être un vecteur d'un point sur la ligne au point que vous testez. Si vous spécifiez les sommets de vos coins rectangle avec un ordre d'enroulement constant (par exemple, toujours dans le sens des aiguilles d'une montre ou dans le sens inverse des aiguilles d'une montre), vous saurez quel signe doit être le point lorsque l'autre rectangle est sur le côté la ligne correspondant à l'extérieur du rectangle.
pseudo-code:
function hasSeparatingAxis(a, b)
{
// test each side of a in turn:
for(i = 0; i < a.side_count; i++)
{
normal_x = a.verts[(i+1)%a.side_count].y - a.verts[i].y;
normal_y = a.verts[i].x - a.verts[(i+1)%a.side_count].x;
for(j = 0; j < b.side_count; j++)
{
dot_product = ((b.vert[j].x - a.verts[i].x) * normal_x) +
((b.vert[j].y - a.verts[i].y) * normal_y);
if(dot_product <= 0.0) // change sign of test based on winding order
break;
if(j == b.side_count-1)
return true; // all dots were +ve, we found a separating axis
}
}
return false;
}
function intersects(a, b)
{
return !hasSeparatingAxis(a, b) && !hasSeparatingAxis(b, a);
}