web-dev-qa-db-fra.com

Vérification en Java si deux rectangles se chevauchent en un point quelconque

J'ai plusieurs rectangles et un rectangle spécial: le rectangle de sélection .. Je veux vérifier pour chaque rectangle si le rectangle contient au moins un point situé à l'intérieur du rectangle de sélection .

Selection example

17
user2190492

Cela permettra de déterminer si le rectangle chevauche un autre rectangle:

public boolean overlaps (Rectangle r) {
    return x < r.x + r.width && x + width > r.x && y < r.y + r.height && y + height > r.y;
}
21
CodeCamper

Nous pouvons déterminer un rectangle avec une seule de ses diagonales. 
Disons que la diagonale du rectangle gauche est (x1, y1) à (x2, y2) 
Et la diagonale du rectangle droit est (x3, y3) à (x4, y4) 

 Sample

Maintenant, si l’une de ces 4 conditions est vraie, vous pouvez dire que les rectangles ne se chevauchent pas:

  1. x3> x2 (OU)
  2. y3> y2 (OU)
  3. x1> x4 (OU)
  4. y1> y4  enter image description here

N'importe quoi en dehors de ces conditions signifie qu'elles se chevauchent!

48
A-patel-guy

Je voudrais créer des objets Rectangle ( http://docs.Oracle.com/javase/8/docs/api/Java/awt/Rectangle.html ), puis utiliser les méthodes Rectangle.intersects et Rectangle.contains pour déterminer si elles se croisent ou si l’un contient l’autre.

Puisque vous avez un grand rectangle, le rectangle de sélection, c'est encore plus facile que je ne le pensais. Exécuter Rectangle.contains, et pour tous les rectangles qui ne sont pas contenus, exécutez Rectangle.intersects et vous avez ce que vous recherchez.

8
Marshall Tigerus

Voici une autre solution plus simple:

    // Left x 
    int leftX = Math.max(x1, x3);
    // Right x
    int rightX = Math.min(x2, x4);
    // Bottom y
    int botY = Math.max(y1, y3);
    // TopY
    int topY = Math.min(y2, y4);

    if (rightX > leftX && topY > botY)
       return true;
5
A-patel-guy

Si le premier implémente RectangularShape et le second est un Rectangle2D , vous pouvez simplement utiliser RectangularShape.intersects :

selectionRectangle.intersects(otherRectangle)

Teste si l'intérieur de la forme croise l'intérieur d'un Rectangle2D spécifié

Depuis les documents Java Oracle

2
Supuhstar

J'ai une implémentation générique pour les polygones dans le système de coordonnées GPS, ce qui peut être un peu exagéré pour les rectangles (qui sont de simples polygones); mais ça va marcher. Il devrait être assez simple d'adapter l'approche à votre cas d'utilisation si, pour une raison quelconque, vous ne souhaitez pas utiliser AWT.

https://github.com/jillesvangurp/geogeometry/blob/master/src/main/Java/com/jillesvangurp/geo/GeoGeometry.Java#L753 (méthode de chevauchement)

Ce que je fais ici consiste simplement à vérifier si les polygones ont des points contenus dans l’autre polygone.

Pour le confinement de points par polygones, j'ai un algorithme simple qui parcourt les bords du polygone pour vérifier si le point est à l'intérieur ou à l'extérieur de O (n). Pour les rectangles, il devrait être peu coûteux à exécuter.

La bonne chose à propos de cette approche, il fonctionnera pour tous les rectangles et également des rectangles pivotés ou des formes plus complexes. 

1
Jilles van Gurp

Deux rectangles ne pas se chevauchent si l’une des conditions suivantes est vraie.
1) Un rectangle est au-dessus du bord supérieur d’un autre rectangle.
2) Un rectangle est à gauche du bord gauche de l’autre rectangle.

Notez qu'un rectangle peut être représenté par deux coordonnées, en haut à gauche et en bas à droite. Nous avons donc principalement quatre coordonnées suivantes.
l1: Coordonnée haut gauche du premier rectangle.
r1: En bas Coordonnée droite du premier rectangle.
l2: Coordonnée haut gauche du deuxième rectangle.
r2: Coordonnée inférieure droite du deuxième rectangle. 

class Point
{
    int x, y;
};

// Returns true if two rectangles (l1, r1) and (l2, r2) overlap
bool doOverlap(Point l1, Point r1, Point l2, Point r2)
{
    // If one rectangle is on left side of other
    if (l1.x > r2.x || l2.x > r1.x)
        return false;

    // If one rectangle is above other
    if (l1.y < r2.y || l2.y < r1.y)
        return false;

    return true;
}
1
JerryGoyal

Cette classe suppose le left<=right, top<=bottom, x1<=x2, y1<=y2:

public class Rect
{
int left, right, bottom, top;

Rect(int left, int top, int right, int bottom)
{
    this.left = left;
    this.right = right;
    this.top = top;
    this.bottom = bottom;
}

boolean overlap(int x1, int y1, int x2, int y2)
{
    // if one rectangle is to the left or right, then there can be no overlap
    if(x2 < left || right < x1)
        return false;

    // the x values overlap, but the y values may still lie outside the rectangle

    // if one rectangle is above or below, then there can be no overlap
    if(y2 < top || bottom < y1)
        return false;

    // otherwise we must overlap !
    return true;        
}
}
0
Antinous