Vérifier si deux rectangles se chevauchent en Java

Vérifier si deux rectangles se chevauchent en Java

1. Vue d'ensemble

Dans ce rapide tutoriel, nous allons apprendre à résoudre un problème algorithmique consistant à vérifier si les deux rectangles donnés se chevauchent.

Nous allons commencer par examiner la définition du problème, puis élaborer progressivement une solution.

Enfin, nous allons l'implémenter en Java.

2. Définition du problème

Disons que nous avons deux rectangles donnés -r1 etr2. Nous devons vérifier s'il existe au moins un point commun entrer1 etr2. Si oui, cela signifie simplement que ces deux rectangles se chevauchent.

Jetons un œil à quelques exemples:

image

Si nous remarquons le tout dernier cas, les rectanglesr1 etr2 n'ont pas de frontières qui se croisent. Pourtant, ils chevauchent des rectangles car chaque point der1 est également un point der2.

3. La configuration initiale

Pour résoudre ce problème, commençons par définir un rectangle par programme. A rectangle can be easily represented by its bottom-left and top-right coordinates:

public class Rectangle {
    private Point bottomLeft;
    private Point topRight;

    //constructor, getters and setters

    boolean isOverlapping(Rectangle other) {
        ...
    }
}

Point est une classe représentant un point(x,y) dans l'espace:

public class Point {
    private int x;
    private int y;

    //constructor, getters and setters
}

Nous définirons plus tard la méthodeisOverlapping(Rectangle other) dans notre classeRectangle pour vérifier si elle chevauche un autre rectangle donné -other.

4. Solution

Les deuxgiven rectangles won’t overlap if l'une ou l'autre des conditions ci-dessous est vraie:

  1. L'un des deux rectangles est au-dessus du bord supérieur de l'autre rectangle

  2. L'un des deux rectangles se trouve du côté gauche du bord gauche de l'autre rectangle

image

Dans tous les autres cas, les deux rectangles se chevaucheront. Pour nous convaincre, nous pouvons toujours en tirer plusieurs exemples.

5. Implémentation Java

Maintenant que nous comprenons la solution, implémentons notre méthodeisOverlapping():

public boolean isOverlapping(Rectangle other) {
    if (this.topRight.getY() < other.bottomLeft.getY()
      || this.bottomLeft.getY() > other.topRight.getY()) {
        return false;
    }
    if (this.topRight.getX() < other.bottomLeft.getX()
      || this.bottomLeft.getX() > other.topRight.getX()) {
        return false;
    }
    return true;
}

Notre méthodeisOverlapping() dans la classeRectangle renvoiefalse si l'un des rectangles est au-dessus ou à gauche de l'autre,true sinon.

Pour savoir si un rectangle est au-dessus de l'autre, nous comparons leursy-coordinates. De même, nous comparons lesx-coordinates pour vérifier si un rectangle est à gauche de l'autre.

6. Conclusion

Dans ce court article, nous avons appris à résoudre un problème algorithmique consistant à déterminer si les deux rectangles donnés se chevauchent. Il sert de stratégie de détection de collision pour deux objets rectangulaires.

Comme d'habitude, l'intégralité du code source est disponibleover on Github.