web-dev-qa-db-ja.com

Java 2つの長方形が任意の点で重なっているかどうかを確認する

複数の四角形と1つの特別な四角形、選択四角形があります。四角形に選択四角形の内側にある少なくとも1つのポイントが含まれている場合、各四角形を確認したいです。わかりやすくするために画像を示します。

Selection example

19
user2190492

これにより、長方形が別の長方形と重なっているかどうかがわかります。

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

対角線が1つだけの長方形を決定できます。
左の長方形の対角線は(x1、y1)から(x2、y2)としましょう
そして、右の長方形の対角線は(x3、y3)から(x4、y4)

Sample

これらの4つの条件のいずれかが当てはまる場合、長方形は重なっていないと言えます。

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

これらの状態以外のことは、それらが重複していることを意味します!

Leetcodeのサンプルソリューション(アプローチ2): https://leetcode.com/problems/rectangle-overlap/discuss/141724/Clear-Java-Code-x-2

55
ThePatelGuy

Rectangle objects を作成し、Rectangle.intersectsおよびRectangle.containsメソッドは、それらが交差するか、一方が他方を含むかを決定します。

1つの大きな長方形、つまり選択長方形があるので、これは思ったよりもさらに簡単です。 Rectangle.containsを実行し、含まれていないすべての長方形に対してRectangle.intersectsを実行すると、探しているものが得られます。

9

もう1つの簡単なソリューションを次に示します。

    // 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
ThePatelGuy

最初のものが RectangularShape を実装し、2番目のものが Rectangle2D 、単純に RectangularShape.intersects

selectionRectangle.intersects(otherRectangle)

Shapeの内部が指定されたRectangle2Dの内部と交差するかどうかをテストします

から Oracle Java docs

2
Supuhstar

GPS座標系のポリゴンの一般的な実装がありますが、これは長方形(単純なポリゴン)では少しやり過ぎかもしれません。しかし、それは動作します。なんらかの理由でAWTを使用したくない場合は、ユースケースにアプローチを適応させるのはかなり簡単です。

https://github.com/jillesvangurp/geogeometry/blob/master/src/main/Java/com/jillesvangurp/geo/GeoGeometry.Java#L75 (重複メソッド)

ここで行うことは、ポリゴンに他のポリゴンに含まれるポイントがあるかどうかを確認するだけです。

多角形のポイントの封じ込めには、多角形のエッジをウォークして、ポイントがO(n)の内側か外側かを確認する簡単なアルゴリズムがあります。長方形の場合、実行するのに安価なはずです。

このアプローチの素晴らしい点は、任意の長方形、回転した長方形、またはより複雑な形状でも機能することです。

1
Jilles van Gurp

2つの長方形しない次の条件のいずれかに該当する場合、重複します。
1)1つの長方形は、他の長方形の上端の上にあります。
2)1つの長方形は、他の長方形の左端の左側にあります。

長方形は、左上と右下の2つの座標で表すことができることに注意してください。したがって、主に次の4つの座標が与えられます。
l1:最初の長方形の左上座標。
r1:最初の長方形の右下座標。
l2:2番目の長方形の左上座標。
r2:2番目の長方形の右下座標。

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

このクラスは、left<=righttop<=bottomx1<=x2y1<=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
Pixel