C++で一方の円がもう一方の円の内側にあるかどうかを判定する方法
2つの円(中心座標と半径)が与えられたとき、小さい方の円が大きい方の円の内側に収まっているかどうかを判定する問題について解説します。判定結果は、以下の3つの場合に分けられます。
円の位置関係の3つのパターン
- パターン1:完全に内側にある場合
小さい円が大きい円の内部にあり、互いに接触していない状態です。このとき、「2つの中心間の距離 + 小さい円の半径」が「大きい円の半径」より小さくなります。 - パターン2:内接している場合
小さい円が大きい円の内部にあるものの、大きい円の円周に接している状態です。このとき、「2つの中心間の距離 + 小さい円の半径」が「大きい円の半径」と等しくなります。 - パターン3:一部だけ重なっている場合
小さい円の一部が大きい円の内部に入っているが、全体としては収まっていない状態です。このとき、「2つの中心間の距離 + 小さい円の半径」が「大きい円の半径」より大きくなります。
判定アルゴリズムの考え方
この問題を解くには、まず2つの円の中心間の距離を求めます。次に、その距離と両方の半径を比較することで、上記のどのケースに該当するかを判定できます。具体的には、中心間の距離に小さい円の半径を加えた値と、大きい円の半径を比較するだけで十分です。
C++による実装例
#include <iostream>
#include <cmath>
using namespace std;
void isCircleInside(int x_big, int y_big, int x_small, int y_small, int r_big, int r_small) {
// 2つの中心間の距離を計算
int distSq = sqrt(((x_big - x_small) * (x_big - x_small)) + ((y_big - y_small) * (y_big - y_small)));
if (distSq + r_small == r_big)
cout << "大きい円の内側にあり、円周に接している" << endl;
else if (distSq + r_small < r_big)
cout << "大きい円に完全に内側にある" << endl;
else
cout << "大きい円の内側にない" << endl;
}
int main() {
int x1 = 10, y1 = 8; // 大きい円の中心
int x2 = 1, y2 = 2; // 小さい円の中心
int r1 = 30, r2 = 10; // 大きい円・小さい円の半径
isCircleInside(x1, y1, x2, y2, r1, r2);
}実行結果
大きい円に完全に内側にある
コードのポイント
このプログラムでは、三平方の定理(ピタゴラスの定理)を使って2点間のユークリッド距離を計算しています。sqrt()関数は<cmath>ヘッダーで定義されているため、インクルードが必要です。また、整数同士の比較で判定しているため、浮動小数点数の誤差を気にせずシンプルに実装できるのが特徴です。
実際の応用では、衝突判定や当たり判定の処理、地理情報システム(GIS)での領域包含チェックなど、さまざまな場面でこの考え方が活用されます。
-
C++で直線が円に接するか交わるかを判定する方法
円と1本の直線があるとします。この課題では、直線が円に接するか、交わるか、あるいは円の外側を通るかを判定します。つまり、直線と円の位置関係には次の3つの場合が考えられます。判定の手順この問題は、以下の手順で解くことができます。円の中心から直線までの垂線の長さ P を求める垂線の長さ P と半径 r を比較するP > r の場合:直線は円の外側を通るP = r の場合:直線は円に接するP < r の場合:直線は円と交わる(円の内部を通る)垂線の距離を求める公式直線が ax + by + c = 0 で表され、円の中心点が (h, k) の場合、中心から直線までの垂線の距離は次の公式で
-
C++で特定の円が2つの同心円が作るリングの内側に完全に含まれるかどうかを判定する方法
原点を中心とする2つの同心円があるとします。内側の円の半径を r、外側の円の半径を R(R > r)とすると、この2つの円の間にはリング状の領域が生まれます。ここにもう1つ別の円があり、その半径 r1 と中心座標 (x, y) が与えられたとき、この円がリングの内側に完全に収まっているかどうかを判定するのが本記事のテーマです。 解き方の考え方 この問題は、三平方の定理(ピタゴラスの定理)を使うことで簡単に解けます。まず、対象の円の中心から原点までの距離 dis を次の式で計算します。 dis = √(x² + y²) 続いて、次の2つの条件を確認します。 内側の条件: 円のうち原点に最