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

C++で直線が円に接するか交わるかを判定する方法

円と1本の直線があるとします。この課題では、直線が円に接するか、交わるか、あるいは円の外側を通るかを判定します。つまり、直線と円の位置関係には次の3つの場合が考えられます。

C++で直線が円に接するか交わるかを判定する方法

判定の手順

この問題は、以下の手順で解くことができます。

  • 円の中心から直線までの垂線の長さ P を求める
  • 垂線の長さ P と半径 r を比較する
    • P > r の場合:直線は円の外側を通る
    • P = r の場合:直線は円に接する
    • P < r の場合:直線は円と交わる(円の内部を通る)

垂線の距離を求める公式

直線が ax + by + c = 0 で表され、円の中心点が (h, k) の場合、中心から直線までの垂線の距離は次の公式で求められます。

$$\frac{ah+bk+c}{\sqrt{a^2+b^2}}$$

サンプルコード

#include <iostream>
#include <cmath>
using namespace std;
void isTouchOrIntersect(int a, int b, int c, int h, int k, int radius) {
    int dist = (abs(a * h + b * k + c)) / sqrt(a * a + b * b);
    if (radius == dist)
        cout << "Touching the circle" << endl;
    else if (radius > dist)
        cout << "Intersecting the circle" << endl;
    else
        cout << "Outside the circle" << endl;
}
int main() {
    int radius = 5;
    int h = 0, k = 0;
    int a = 3, b = 4, c = 25;
    isTouchOrIntersect(a, b, c, h, k, radius);
}

実行結果

Touching the circle

この例では、直線 3x + 4y + 25 = 0 と、中心 (0, 0)・半径 5 の円の位置関係を判定しています。垂線の距離は |3×0 + 4×0 + 25| ÷ √(3² + 4²) = 25 ÷ 5 = 5 となり、半径と一致するため「円に接する(Touching the circle)」と出力されます。

なお、浮動小数点数を扱う場合は誤差を考慮し、厳密な等号比較の代わりに許容誤差(イプシロン)を使った比較を行うと、より堅牢な判定が可能になります。

  1. C++で直線が円に接するか交わるかを判定する方法

    円と1本の直線があるとします。この課題では、直線が円に接するか、交わるか、あるいは円の外側を通るかを判定します。つまり、直線と円の位置関係には次の3つの場合が考えられます。判定の手順この問題は、以下の手順で解くことができます。円の中心から直線までの垂線の長さ P を求める垂線の長さ P と半径 r を比較するP > r の場合:直線は円の外側を通るP = r の場合:直線は円に接するP < r の場合:直線は円と交わる(円の内部を通る)垂線の距離を求める公式直線が ax + by + c = 0 で表され、円の中心点が (h, k) の場合、中心から直線までの垂線の距離は次の公式で

  2. C++でべき等行列を判定するプログラムの作成方法

    行数を r、列数を c とする行列 M[r][c] が与えられ、r = c となる正方行列を考えます。この記事では、与えられた正方行列がべき等行列(アイデンポテント行列)であるかどうかを判定するC++プログラムを解説します。 べき等行列とは 行列 M がべき等行列であるとは、行列 M と自分自身の積が元の行列 M と等しくなること、すなわち M × M = M が成り立つことを指します。 例えば、次の行列を見てください。 この行列を自分自身で掛け合わせても、結果は元の行列とまったく同じになります。したがって、この行列はべき等行列であると言えます。 べき等行列の代表的な例としては、ベクトルを