Verifique se dois retângulos se sobrepõem em Java
1. Visão geral
Neste tutorial rápido, aprenderemos a resolver um problema algorítmico de verificar se os dois retângulos dados se sobrepõem.
Começaremos examinando a definição do problema e, em seguida, construiremos uma solução progressivamente.
Finalmente, vamos implementá-lo em Java.
2. Definição de problema
Digamos que temos dois retângulos dados -r1er2. Precisamos verificar se há pelo menos um ponto comum entrer1er2. Se sim, significa simplesmente que esses dois retângulos se sobrepõem.
Vamos dar uma olhada em alguns exemplos:
Se notarmos o último caso, os retângulosr1er2 não têm fronteiras de interseção. Ainda assim, eles são retângulos sobrepostos, pois cada ponto emr1 também é um ponto emr2.
3. Configuração inicial
Para resolver esse problema, devemos começar definindo um retângulo programaticamente. 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) {
...
}
}
ondePoint é uma classe que representa um ponto(x,y) no espaço:
public class Point {
private int x;
private int y;
//constructor, getters and setters
}
Posteriormente, definiremos o métodoisOverlapping(Rectangle other) em nossa classeRectangle para verificar se ele se sobrepõe a outro retângulo dado -other.
4. Solução
Os doisgiven rectangles won’t overlap if de qualquer uma das condições abaixo são verdadeiros:
-
Um dos dois retângulos está acima da borda superior do outro retângulo
-
Um dos dois retângulos está no lado esquerdo da borda esquerda do outro retângulo
Para todos os outros casos, os dois retângulos se sobrepõem. Para nos convencer, podemos sempre desenhar vários exemplos.
5. Implementação Java
Agora que entendemos a solução, vamos implementar nosso métodoisOverlapping():
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;
}
Nosso métodoisOverlapping() na classeRectangle retornafalse se um dos retângulos estiver acima ou à esquerda do outro,true caso contrário.
Para descobrir se um retângulo está acima do outro, comparamos seusy-coordinates. Da mesma forma, comparamosx-coordinates para verificar se um retângulo está à esquerda do outro.
6. Conclusão
Neste breve artigo, aprendemos como resolver um problema algorítmico de descobrir se os dois retângulos dados se sobrepõem. Serve como uma estratégia de detecção de colisão para dois objetos retangulares.
Como de costume, todo o código fonte está disponívelover on Github.