Controlla se due rettangoli si sovrappongono in Java

1. Panoramica

In questo rapido tutorial, impareremo a risolvere un problema algoritmico di controllo della sovrapposizione dei due rettangoli dati.

Inizieremo esaminando la definizione del problema e quindi svilupperemo progressivamente una soluzione.

Infine, lo implementeremo in Java.

2. Definizione del problema

Supponiamo di avere due rettangoli dati: r1 e r2 . Dobbiamo verificare se c'è almeno un punto comune tra r1 e r2 . Se sì, significa semplicemente che questi due rettangoli si sovrappongono.

Diamo uno sguardo ad alcuni esempi:

Se notiamo l'ultimo caso, i rettangoli r1 e r2 non hanno confini intersecanti. Tuttavia, sono rettangoli sovrapposti poiché ogni punto in r1 è anche un punto in r2 .

3. Installazione iniziale

Per risolvere questo problema, dobbiamo prima iniziare definendo un rettangolo a livello di programmazione. Un rettangolo può essere facilmente rappresentato dalle sue coordinate in basso a sinistra e in alto a destra:

public class Rectangle { private Point bottomLeft; private Point topRight; //constructor, getters and setters boolean isOverlapping(Rectangle other) { ... } }

dove Point è una classe che rappresenta un punto (x, y) nello spazio:

public class Point { private int x; private int y; //constructor, getters and setters }

Definiremo in seguito il metodo isOverlapping (Rectangle other) nella nostra classe Rectangle per verificare se si sovrappone a un altro rettangolo dato - altro .

4. Soluzione

I due rettangoli dati non si sovrapporranno se una delle seguenti condizioni è vera:

  1. Uno dei due rettangoli si trova sopra il bordo superiore dell'altro rettangolo
  2. Uno dei due rettangoli si trova sul lato sinistro del bordo sinistro dell'altro rettangolo

In tutti gli altri casi, i due rettangoli si sovrapporranno l'uno con l'altro. Per convincerci, possiamo sempre tirare fuori diversi esempi.

5. Implementazione Java

Ora che abbiamo capito la soluzione, implementiamo il nostro metodo isOverlapping () :

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

Il nostro metodo isOverlapping () nella classe Rectangle restituisce false se uno dei rettangoli è sopra o a sinistra dell'altro, altrimenti true .

Per scoprire se un rettangolo è sopra l'altro, confrontiamo le loro coordinate y . Allo stesso modo, confrontiamo le coordinate x per verificare se un rettangolo è a sinistra dell'altro.

6. Conclusione

In questo breve articolo, abbiamo imparato come risolvere un problema algoritmico per scoprire se i due rettangoli dati si sovrappongono l'uno con l'altro. Serve come strategia di rilevamento delle collisioni per due oggetti rettangolari.

Come al solito, l'intero codice sorgente è disponibile su Github.