C++で2つの長方形が重なっているかどうかを判定する方法
長方形は、左上の角と右下の角という2つの座標点で表現できます。本記事では、2つの長方形が与えられたときに、それらが互いに重なっているかどうかを判定する方法をC++で解説します。
判定に使用するのは、次の4つの座標点です。
- l1:1つ目の長方形の左上の角
- r1:1つ目の長方形の右下の角
- l2:2つ目の長方形の左上の角
- r2:2つ目の長方形の右下の角
ここでは、両方の長方形が座標軸に平行であると仮定します。この場合、次の2つの条件を確認するだけで重なりを判定できます。
重なっていないと判定される条件
以下のいずれかが成立する場合、2つの長方形は重なっていません。
- 片方の長方形が、もう片方の長方形の上端よりも上にある
- 片方の長方形が、もう片方の長方形の左端よりも左にある
逆に言えば、これらの条件がどちらも当てはまらない場合、2つの長方形は重なっていることになります。
C++での実装例
#include<iostream>
using namespace std;
class Point {
public:
int x, y;
};
bool isOverlapping(Point l1, Point r1, Point l2, Point r2) {
// x方向で離れている場合は重ならない
if (l1.x > r2.x || l2.x > r1.x)
return false;
// y方向で離れている場合は重ならない
if (l1.y < r2.y || l2.y < r1.y)
return false;
return true;
}
int main() {
Point l1 = {0, 10}, r1 = {10, 0};
Point l2 = {5, 5}, r2 = {15, 0};
if (isOverlapping(l1, r1, l2, r2))
cout << "Rectangles are Overlapping";
else
cout << "Rectangles are not Overlapping";
}実行結果
Rectangles are Overlapping
この例では、1つ目の長方形(左上 {0, 10}、右下 {10, 0})と2つ目の長方形(左上 {5, 5}、右下 {15, 0})がx方向にもy方向にも範囲を共有しているため、「重なっている」と判定されます。
このアルゴリズムの計算量はO(1)であり、座標の比較だけで済むため非常に効率的です。衝突判定や当たり判定など、ゲーム開発や幾何計算のさまざまな場面で応用できる基本的なテクニックです。
-
C++でN階乗の合計の下2桁を求める方法
本記事では、1!からN!までの階乗の合計について、その下2桁(一の位と十の位)を求める方法を解説します。例えば N = 4 の場合、1! + 2! + 3! + 4! = 33 となるため、一の位は「3」、十の位は「3」であり、結果は「33」となります。この問題には重要な性質があります。N が 5 より大きい場合、その階乗の一の位は必ず 0 になるため、6! 以降の項は一の位に一切影響を与えません。同様に、N が 10 以上になると十の位も 0 のまま変化しなくなります。したがって、N = 10 以上では結果は常に「13」で固定されます。実際に N = 1 から 10 までの階乗の値を表に整理
-
C++で中点の座標を使って長方形の4つの頂点を求める方法
問題の概要長方形 ABCD があり、その中点 P と Q の座標、および長方形の辺の長さ L のみが分かっているとします。この課題の目的は、P と Q の座標および辺の長さ L を使って、頂点 A、B、C、D の座標を求めることです。例えば、P が (1, 0)、Q が (1, 2)、L が 2 の場合、A、B、C、D はそれぞれ (0, 0)、(0, 2)、(2, 2)、(2, 0) となります。考えられる3つの場合P と Q の位置関係によって、次の3つの場合が考えられます。長方形が水平な場合:AD と BC が X 軸に平行長方形が垂直な場合:AD と BC が Y 軸に平行長方形が軸に