1.概要

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

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

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

2.問題の定義

2つの長方形(

r1



r2

)があるとしましょう。

r1



r2

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

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

最後のケースに気付くと、長方形

r1



r2

には交差する境界がありません。それでも、

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
}

後で

Rectangle

クラスで

isOverlapping(Rectangle other)

メソッドを定義して、他の指定された長方形

other

と重なるかどうかを確認します。

4.解決策

以下の条件のいずれかが当てはまる場合、** 与えられた2つの長方形は重なりません。

  1. 2つの長方形のうちの1つは他の長方形の上端より上

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

他の長方形

他のすべての場合、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()

メソッドは、一方の長方形が他方の上または左側にある場合は

false

を返し、それ以外の場合は

true

を返します。

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

6.まとめ

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

いつものように、ソースコード全体が利用可能です

https://github.com/eugenp/tutorials/tree/master/algorithms-miscellaneous-2

[over
Githubで。