【C++】与えられた点をすべて含む最小の長方形の座標を求める方法
このチュートリアルでは、与えられた複数の座標点をすべて内部に含む長方形の座標を求めるプログラムについて解説します。
問題の概要
いくつかの座標点が与えられます。私たちのタスクは、次の条件を満たす最小の長方形を見つけることです。
- すべての点が長方形の内部(または境界上)に含まれる
- 長方形の辺は座標軸(X軸・Y軸)に平行である
このような長方形は「バウンディングボックス」とも呼ばれ、各点のX座標・Y座標の最小値と最大値から簡単に求めることができます。
解決のアプローチ
軸に平行な最小の長方形は、以下の4つの値だけで決まります。
- Xmin: すべての点のX座標の最小値
- Xmax: すべての点のX座標の最大値
- Ymin: すべての点のY座標の最小値
- Ymax: すべての点のY座標の最大値
これらを使うと、長方形の4つの頂点は次のように表せます。
- 左下: (Xmin, Ymin)
- 左上: (Xmin, Ymax)
- 右上: (Xmax, Ymax)
- 右下: (Xmax, Ymin)
C++での実装例
#include <bits/stdc++.h>
using namespace std;
// 最小の長方形の座標を計算する関数
void print_rectangle(int X[], int Y[], int n){
// 各座標の最小値と最大値を求める
int Xmax = *max_element(X, X + n);
int Xmin = *min_element(X, X + n);
int Ymax = *max_element(Y, Y + n);
int Ymin = *min_element(Y, Y + n);
// 長方形の4つの頂点を出力
cout << "{" << Xmin << ", " << Ymin << "}" << endl;
cout << "{" << Xmin << ", " << Ymax << "}" << endl;
cout << "{" << Xmax << ", " << Ymax << "}" << endl;
cout << "{" << Xmax << ", " << Ymin << "}" << endl;
}
int main(){
int X[] = { 4, 3, 6, 1, -1, 12 };
int Y[] = { 4, 1, 10, 3, 7, -1 };
int n = sizeof(X) / sizeof(X[0]);
print_rectangle(X, Y, n);
return 0;
}
実行結果
{-1, -1}
{-1, 10}
{12, 10}
{12, -1}
コードの解説
このプログラムでは、標準ライブラリの max_element と min_element を使って、配列内のX座標・Y座標それぞれの最大値と最小値を効率的に取得しています。
入力データの場合、X座標の範囲は -1〜12、Y座標の範囲は -1〜10 となるため、出力される4つの頂点が最小の長方形を構成します。
計算量は点の数を n とすると O(n) であり、非常に効率的なアルゴリズムです。座標変換や衝突判定、データの可視化など、さまざまな場面で応用できる基本的なテクニックなので、ぜひ覚えておきましょう。
-
C++で解く長方形エリアII ― 座標圧縮と走査線法による被覆面積の計算
問題概要 軸に平行な長方形のリストが与えられるものとします。各 rectangle[i] = {x1, y1, x2, y2} において、(x1, y1) は i 番目の長方形の左下隅の座標、(x2, y2) は右上隅の座標を表します。 求めたいのは、平面上でこれらすべての長方形が覆っている領域の合計面積です。答えは非常に大きな値になる可能性があるため、109 + 7 で割った余りを返すことになっています。 たとえば、入力が次のような場合を考えてみましょう。 このとき、出力は 6 となります。 解法の方針:座標圧縮+走査線(スイープライン) この問題は、座標圧縮(座標の離散化)と走査線法(
-
C++で同一直線上に存在する最大点数を求めるアルゴリズム
問題概要 2次元平面上に複数の点が与えられたとき、同じ直線上に存在する点の最大数を求めるのがこの問題の目的です。 例えば、下図のような6つの点が与えられた場合、最も多くの点が乗っている直線上には4つの点が存在します。 解法のアプローチ この問題は、隣り合う2点を通る直線を基準にして、残りのすべての点がその直線上に乗っているかどうかを順番に判定していくことで解けます。 3点 (x1, y1)、(x2, y2)、(x3, y3) が同一直線上にあるかどうかは、「傾きが等しい」こと、すなわち外積(クロス積)が0になることを利用して判定できます。 (y3 − y2) × (x2 − x1) = (