Kontroller, om to rektangler overlapper hinanden i Java

1. Oversigt

I denne hurtige vejledning lærer vi at løse et algoritmisk problem med at kontrollere, om de to givne rektangler overlapper hinanden.

Vi starter med at se på problemdefinitionen og derefter gradvist opbygge en løsning.

Endelig implementerer vi det i Java.

2. Problemdefinition

Lad os sige, at vi har to givne rektangler - r1 og r2. Vi skal kontrollere, om der er mindst et fælles punkt blandt r1 og r2. Hvis ja, betyder det simpelthen, at disse to rektangler overlapper hinanden.

Lad os se på nogle eksempler:

Hvis vi bemærker den sidste sag, rektanglerne r1 og r2 har ingen skærende grænser. Alligevel overlapper de rektangler som hvert punkt i r1 er også et punkt i r2.

3. Første opsætning

For at løse dette problem skal vi først starte med at definere et rektangel programmatisk. Et rektangel kan let repræsenteres af dets nederste venstre og øverste højre koordinater:

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

hvor Punkt er en klasse, der repræsenterer et punkt (x, y) i rummet:

offentlig klasse Punkt {privat int x; privat int y; // konstruktør, getters og setters}

Vi definerer senere isOverlapping (Rektangel andet) metode i vores Rektangel klasse for at kontrollere, om den overlapper med en anden given rektangel - Andet.

4. Løsning

De to givne rektangler overlapper ikke, hvis en af ​​nedenstående betingelser gælder:

  1. En af de to rektangler er over den øverste kant af den anden rektangel
  2. En af de to rektangler er på venstre side af venstre kant af det andet rektangel

I alle andre tilfælde overlapper de to rektangler med hinanden. For at overbevise os selv kan vi altid trække flere eksempler.

5. Java-implementering

Nu hvor vi forstår løsningen, lad os implementere vores isOverlapping () metode:

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

Vores isOverlapping () metode i Rektangel klasse vender tilbage falsk hvis en af ​​rektanglerne enten er over eller til venstre for den anden, rigtigt Ellers.

For at finde ud af om det ene rektangel er over det andet sammenligner vi deres y-koordinater. Ligeledes sammenligner vi x-koordinater for at kontrollere, om det ene rektangel er til venstre for det andet.

6. Konklusion

I denne korte artikel lærte vi, hvordan man løser et algoritmisk problem med at finde ud af, om de to givne rektangler overlapper hinanden. Det fungerer som en kollisionsdetekteringsstrategi for to rektangulære objekter.

Som normalt er hele kildekoden tilgængelig på Github.