if (RectA.Left < RectB.Right && RectA.Right > RectB.Left &&
RectA.Top > RectB.Bottom && RectA.Bottom < RectB.Top )
ou, en utilisant des coordonnées cartésiennes
(X1 étant la coordonnée gauche, X2 la coordonnée droite, en augmentant de gauche à droite et Y1 étant la coordonnée supérieure, et Y2 étant la coordonnée inférieure, en augmentant de bas en haut -- si ce n'est pas le cas de votre système de coordonnées [par exemple, la plupart des ordinateurs ont la direction Y inversée], swap les comparaisons ci-dessous ) ...
if (RectA.X1 < RectB.X2 && RectA.X2 > RectB.X1 &&
RectA.Y1 > RectB.Y2 && RectA.Y2 < RectB.Y1)
Disons que vous avez Rect A, et Rect B. La preuve est faite par contradiction. L'une des quatre conditions suivantes garantit que aucun chevauchement ne peut exister :
- Cond1. Si l'arête gauche de A est à droite de l'arête droite de B, - alors A est totalement à droite de B
- Cond2. Si l'arête droite de A est à gauche de l'arête gauche de B, - alors A est totalement à gauche de B
- Cond3. Si l'arête supérieure de A est en dessous de l'arête inférieure de B, - alors A est totalement sous B
- Cond4. Si l'arête inférieure de A est au-dessus de l'arête supérieure de B, - alors A est totalement au-dessus de B
La condition pour le non-chevauchement est donc
NON-Overlap => Cond1 Or Cond2 Or Cond3 Or Cond4
Par conséquent, une condition suffisante pour le chevauchement est l'inverse.
Overlap => NOT (Cond1 Or Cond2 Or Cond3 Or Cond4)
La loi de Morgan dit
Not (A or B or C or D)
est la même chose que Not A And Not B And Not C And Not D
donc en utilisant De Morgan, on a
Not Cond1 And Not Cond2 And Not Cond3 And Not Cond4
Ceci est équivalent à :
- Bord gauche de A à gauche du bord droit de B, [
RectA.Left < RectB.Right
], et
- Le bord droit de A à droite du bord gauche de B, [
RectA.Right > RectB.Left
], et
- Le haut de A au-dessus du bas de B, [
RectA.Top > RectB.Bottom
], et
- Le bas de A en dessous du haut de B [
RectA.Bottom < RectB.Top
]
Note 1 : Il est assez évident que ce même principe peut être étendu à un nombre quelconque de dimensions.
Note 2 : Il devrait également être assez évident de compter les chevauchements d'un seul pixel, en changeant la valeur de l'option <
et/ou le >
sur cette frontière à une <=
ou un >=
.
Note 3 : Cette réponse, lorsqu'elle utilise les coordonnées cartésiennes (X, Y) est basée sur les coordonnées cartésiennes algébriques standard (x augmente de gauche à droite, et Y augmente de bas en haut). Évidemment, lorsqu'un système informatique pourrait mécaniser les coordonnées cartésiennes différemment, (par exemple, en augmentant Y de haut en bas, ou X de droite à gauche), la syntaxe devra être ajustée en conséquence/
5 votes
Je pense que la solution à votre problème n'implique pas cualquier la multiplication.
0 votes
Si vous avez besoin d'une réponse pour le rectangle pivoté, j'ai créé une réponse avec toutes les étapes : stackoverflow.com/questions/62028169/ (il est en Javascript mais peut être reproduit en C++ facilement)