1. 概要

このクイックチュートリアルでは、指定された2つの長方形が重なっているかどうかをチェックするアルゴリズムの問題を解決する方法を学びます。

まず、問題の定義を確認してから、徐々に解決策を構築していきます。

最後に、Javaで実装します。

2. 問題の定義

r1r2の2つの長方形があるとします。 r1r2の間に少なくとも1つの共通点があるかどうかを確認する必要があります。 はいの場合、それは単にこれら2つの長方形が重なっていることを意味します。

いくつかの例を見てみましょう。

最後のケースに気付いた場合、長方形r1r2には交差する境界がありません。 それでも、 r1 のすべてのポイントは、 r2 のポイントでもあるため、長方形が重なっています。

3. 初期設定

この問題を解決するには、まずプログラムで長方形を定義することから始める必要があります。 長方形は、左下と右上の座標で簡単に表すことができます:

public class Rectangle {
    private Point bottomLeft;
    private Point topRight;

    //constructor, getters and setters

    boolean isOverlapping(Rectangle other) {
        ...
    }
}

ここで、 Point は、空間内のポイント(x、y)を表すクラスです。

public class Point {
    private int x;
    private int y;

    //constructor, getters and setters
}

後でisOverlapping(Rectangle other)メソッドを Rectangle クラスで定義して、別の指定された長方形– otherとオーバーラップするかどうかを確認します。

4. 解決

次の条件のいずれかが当てはまる場合、2つの指定された長方形はオーバーラップしません。

  1. 2つの長方形の一方は、もう一方の長方形の上端の上にあります
  2. 2つの長方形の一方は、もう一方の長方形の左端の左側にあります

他のすべての場合、2つの長方形は互いに重なります。 自分を納得させるために、いつでもいくつかの例を引き出すことができます。

5. Javaの実装

解決策を理解したので、 isOverlapping()メソッドを実装しましょう。

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;
}

RectangleクラスのisOverlapping()メソッドは、長方形の1つが他の長方形の上または左側にある場合、falseを返します。true[ X170X]それ以外の場合。

1つの長方形が他の長方形の上にあるかどうかを確認するために、それらのy座標を比較します。 同様に、 x-coordinates を比較して、一方の長方形がもう一方の長方形の左側にあるかどうかを確認します。

6. 結論

この短い記事では、与えられた2つの長方形が互いに重なり合っているかどうかを見つけるというアルゴリズムの問題を解決する方法を学びました。 これは、2つの長方形のオブジェクトの衝突検出戦略として機能します。

いつものように、ソースコード全体はGithubで利用できます。