Intersection de deux rectangles

J’ai deux rectangles caractérisés par 4 valeurs chacun:

Position gauche X , position haute Y , largeur W et hauteur H :

 X1, Y1, H1, W1 X2, Y2, H2, W2 

Les rectangles ne sont pas tournés, comme ceci:

 +--------------------> X axis | | (X,Y) (X+W, Y) | +--------------+ | | | | | | | | | | +--------------+ v (X, Y+H) (X+W,Y+H) Y axis 

Quelle est la meilleure solution pour déterminer si l’intersection des deux rectangles est vide ou non?

 if (X1+W1 

Si vous avez quatre coordonnées - ((X,Y),(A,B)) et ((X1,Y1),(A1,B1)) - plutôt que deux plus la largeur et la hauteur, cela ressemblerait à ceci:

 if (A 

Meilleur exemple ..

 /** * Check if two rectangles collide * x_1, y_1, width_1, and height_1 define the boundaries of the first rectangle * x_2, y_2, width_2, and height_2 define the boundaries of the second rectangle */ boolean rectangle_collision(float x_1, float y_1, float width_1, float height_1, float x_2, float y_2, float width_2, float height_2) { return !(x_1 > x_2+width_2 || x_1+width_1 < x_2 || y_1 > y_2+height_2 || y_1+height_1 < y_2); } 

et aussi une autre façon voir ce lien ... et le coder vous-même ..

Si les deux rectangles ont les mêmes dimensions que vous pouvez faire:

 if (abs (x1 - x2) < w && abs (y1 - y2) < h) { // overlaps } 

Je viens d’essayer avec le programme AC et écrit ci-dessous.

 #include int check(int i,int j,int i1,int j1, int a, int b,int a1,int b1){ return (\ (((i>a) && (ib)&&(ji) && (aj)&&(ba) && (i1b)&&(j1i) && (a1j)&&(b1 

En utilisant un système de coordonnées où (0, 0) est le coin supérieur gauche.

J’y ai pensé en termes de fenêtres coulissantes verticales et horizontales et j’ai trouvé ceci:

(B.Bottom> A.Top && B.Top A.Left && B.Left

Ce que vous obtenez si vous appliquez la loi de DeMorgan à ce qui suit:

Not (B.Bottom A.Bottom || B.Right A.Right)

  1. B est au dessus de A
  2. B est en dessous de A
  3. B est à gauche de A
  4. B a raison de A

Si les coordonnées des rectangles du coin inférieur gauche et du coin supérieur droit sont:
(r1x1, r1y1), (r1x2, r1y2) pour rect1 et
(r2x1, r2y1), (r2x2, r2y2) pour rect2
(Python comme code ci-dessous)

  intersect = False for x in [r1x1, r1x2]: if (r2x1<=x<=r2x2): for y in [r1y1, r1y2]: if (r2y1<=y<=r2y2): intersect = True return intersect else: for Y in [r2y1, r2y2]: if (r1y1<=Y<=r1y2): intersect = True return intersect else: for X in [r2x1, r2x2]: if (r1x1<=X<=r1x2): for y in [r2y1, r2y2]: if (r1y1<=y<=r1y2): intersect = True return intersect else: for Y in [r1y1, r1y2]: if (r2y1<=Y<=r2y2): intersect = True return intersect return intersect 

si (X1 <= X2 + W2 && X2 <= X1 + W1 && Y1> = Y2-H2 && Y2> = Y1 + H1) Intersection

Dans la question Y est la première position.

Remarque: cette solution ne fonctionne que si le rectangle est aligné avec les axes X / Y.