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:
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) {
...
}
}
où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:
-
L'un des deux rectangles est au-dessus du bord supérieur de l'autre rectangle
-
L'un des deux rectangles se trouve du côté gauche du bord gauche de l'autre rectangle
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.