C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で円の中心を基準とした点の象限を判定する方法

円の中心座標と半径が与えられ、別の点 (x, y) が円の中心を基準としてどの象限に位置するのかを求める問題です。点が円の内部に存在する場合はその象限を出力し、円の外部に存在する場合はエラーとして「点が円の外にある」ことを出力します。

円の中心を (h, k)、点の座標を (x, y) とすると、円の方程式は次のように表されます。

(x − h)2 + (y − k)2 = r2

点と中心の距離の二乗を半径の二乗と比較することで、点の位置を判定できます。判定条件は以下の通りです。

  • (x − h)2 + (y − k)2 > r2 の場合 → 点は円の外側にある
  • (x − h)2 + (y − k)2 = r2 の場合 → 点は円周上にある
  • (x − h)2 + (y − k)2 < r2 の場合 → 点は円の内側にある

アルゴリズムの手順

  1. 点が中心そのもの(x == h かつ y == k)の場合は 0 を返す
  2. 距離の二乗 val = (x − h)2 + (y − k)2 を計算する
  3. val が半径の二乗 r2 より大きい場合は −1 を返す(円の外側)
  4. x と h、y と k の大小関係をもとに、点が属する象限(1〜4)を返す

実装例(C++)

#include<iostream>
#include<cmath>
using namespace std;
int getQuadrant(int h, int k, int rad, int x, int y) {
    if (x == h && y == k)
        return 0;
    int val = pow((x - h), 2) + pow((y - k), 2);
    if (val > pow(rad, 2))
        return -1;
    if (x > h && y >= k)
        return 1;
    if (x <= h && y > k)
        return 2;
    if (x < h && y <= k)
        return 3;
    if (x >= h && y < k)
        return 4;
}
int main() {
    int h = 0, k = 3;
    int rad = 2;
    int x = 1, y = 4;
    int ans = getQuadrant(h, k, rad, x, y);
    if (ans == -1)
        cout << "Point is Outside of the circle" << endl;
    else if (ans == 0)
        cout << "Present at the center" << endl;
    else
        cout << ans << " Quadrant" << endl;
}

出力

1 Quadrant

この例では、中心 (0, 3)、半径 2 の円に対して点 (1, 4) を判定しています。点と中心の距離の二乗は (1 − 0)2 + (4 − 3)2 = 2 となり、半径の二乗である 4 より小さいため、点は円の内側に存在します。さらに、点は中心よりも右かつ上に位置しているため、第 1 象限であると判定されます。

  1. C++で円と長方形の重なりを判定するアルゴリズム

    問題の概要円を (radius, xc, yc) という形式で表します。ここで (xc, yc) は円の中心座標です。同様に、軸に平行な長方形(軸平行境界ボックス)を (x1, y1, x2, y2) という形式で表し、(x1, y1) が左下隅の座標、(x2, y2) が右上隅の座標とします。このとき、円と長方形が互いに重なっているかどうかを判定する必要があります。たとえば、次のような入力が与えられた場合を考えてみましょう。この場合、出力は true(重なりあり)となります。解決のアプローチこの問題を解く鍵は、「長方形の中で円の中心に最も近い点」を見つけることです。その点と円の中心との距離が

  2. C++で行列のインクリメント操作後に奇数値となるセルの数を求める方法

    n 行 m 列の行列を考えます。この行列は、すべての要素が 0 で初期化されています。さらに、indices[i] = [ri, ci] の形式でインデックスのペアが与えられます。各ペア [ri, ci] に対して、行 ri に属するすべてのセルと列 ci に属するすべてのセルの値を 1 ずつ加算します。すべてのインデックスに対してこの操作を適用した後、値が奇数になっているセルの総数を求めるのがこの問題の目的です。 解法のステップ この問題は、与えられた操作をそのままシミュレーションすることで解決できます。具体的な手順は以下の通りです。 カウンタ odd を 0 で初期化し、変数 x にはイ