2009-12-04 6 views

Répondre

4

Je suppose que vous voulez réellement le résultat de l'intersection, pas seulement le test si les deux rectangles se croisent.

L'intersection de rect1 = (l1, t1, r1, b1) et rect2 = (L2, T2, R2, b2) est à nouveau un rectangle:

rectIntersection = (max(l1, l2), max(t1, t2), min(r1, r2), min(b1, b2)) 

rectIntersection est naturellement vide si left >= right || top >= bottom supposant un rectangle est à gauche/haut-inclus et à droite/bas-exclusif.

Les rectangles se croisent si

l1 < r2 && l2<r1 && t1<b2 && t2<t1 
+0

Les versions à axe de séparation sont plus efficaces, cette version signifie que vous devrez toujours faire quatre comparaisons. –

+0

+ Vous devrez faire au moins un test supplémentaire pour voir si le rect résultant est vide. Cela signifie que cette version est 5-6 conditionnelles par rapport à 1-4 pour la version SAT. –

+0

Je pense que l'affiche veut réellement l'ensemble résultant des points d'intersection et pas seulement le test si les deux se croisent. Selon le contexte, il peut être préférable de calculer l'intersection et d'affirmer qu'elle n'est pas vide. – Sebastian

2

En supposant que l'origine est sur left-top de l'écran.

Si Vérifier si le coin supérieur gauche d'un rectangle (x3,y3) est inférieur au coin inférieur droit d'un autre rectangle (x2,y2), les deux se croisent.

Les points sont (x2,|y2-y3|) et (|x2-x3|,y2).

Ceci est pour un rectangle1 et un reactangle2 à droite de rectangle1.

Applique l'inverse de la translation de gauche.

1

Deux rectangles se chevauchent lorsqu'il y a au moins un point intérieur X, Y commun aux deux. Soit le premier rectable {T1, L1, B1, R1} et le second {T2, L2, B2, R2} (en haut, à gauche, en bas, à droite). Il s'ensuit que (X>L1) et (X<R1) et (Y>T1) et (Y<B1), et de même pour le rectangle 2. De (X>L1) et (X<R2) il s'ensuit que (L1<R2). De même, (L2<R1), (T1<B2) et (T2<B1).

Ces 4 conditions sont donc nécessaires. Il n'est pas directement évident qu'ils sont également suffisants, mais c'est aussi le cas.

0

Si vous êtes intéressé plus à une fonction pour faire le travail, que de mettre en œuvre un algorithme,
départ IntersectRect Function sur Windows.

Questions connexes