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

C++で3次元空間における2つの平面間の角度を計算する方法

本記事では、3次元空間内にある2つの平面 P1P2 の間の角度を求める方法を解説します。

平面の方程式と角度の公式

平面 Pi の方程式は、一般に次の形式で表されます。

a・x + b・y + c・z + d = 0

ここで、係数 (a, b, c) は平面の法線ベクトルを表しています。2つの平面がなす角度を「A」とすると、それぞれの法線ベクトルのなす角として、次の式で求められます。

cos A = (a₁a₂ + b₁b₂ + c₁c₂) / (√(a₁² + b₁² + c₁²) × √(a₂² + b₂² + c₂²))

つまり、分子は2つの法線ベクトルの内積、分母はそれぞれの法線ベクトルの大きさ(ノルム)の積です。この値の逆余弦(acos)を取れば角度が得られます。

C++による実装例

以下のコードでは、平面を表すクラスを定義し、フレンド関数を使って2つの平面間の角度を計算しています。

#include <iostream>
#include <cmath>
using namespace std;

class Plane {
private:
    double a, b, c, d;
public:
    Plane(double a = 0, double b = 0, double c = 0, double d = 0) {
        this->a = a;
        this->b = b;
        this->c = c;
        this->d = d;
    }
    friend double angle(Plane p1, Plane p2);
};

double angle(Plane p1, Plane p2) {
    double nume = (p1.a * p2.a) + (p1.b * p2.b) + (p1.c * p2.c);   // 内積
    double deno1 = (p1.a * p1.a) + (p1.b * p1.b) + (p1.c * p1.c); // P1のノルム²
    double deno2 = (p2.a * p2.a) + (p2.b * p2.b) + (p2.c * p2.c); // P2のノルム²
    return (180.0 / 3.14159) * acos(nume / (sqrt(deno1) * sqrt(deno2)));
}

int main() {
    Plane p1(2.0, 2.0, -3.0, -5.0), p2(3.0, -3.0, 5.0, -6.0);
    cout << "Angle: " << angle(p1, p2) << " degree";
}

実行結果

Angle: 123.697 degree

コードのポイント

  • Planeクラス:平面の方程式の係数 a, b, c, d をメンバ変数として保持します。
  • angle関数:2つの平面の法線ベクトルの内積とノルムから cos A を求め、acos() で逆余弦を計算した後、ラジアンから度に変換(180/πを掛ける)しています。
  • friend宣言:プライベートメンバにアクセスするため、angle関数をフレンド関数として宣言しています。

なお、acos の返り値は 0〜π(0°〜180°)の範囲となるため、鋭角だけでなく鈍角の結果もそのまま得られます。必要に応じて、結果を 180° から引くことで補角を求めることも可能です。

  1. Javaで2つの区間の間にある素数を表示するプログラム

    この記事では、指定した2つの区間(範囲)の間にある素数を表示するJavaプログラムの作成方法について解説します。素数とは、1とその数自身の2つだけを約数に持ち、それ以外のどの数でも割り切ることのできない特別な数です。 ある数が素数であるのは、その約数が1とその数自身だけである場合です。たとえば11は素数であり、その約数は1と11のみです。素数の例としては、2、3、5、7、11、13などが挙げられます。なお、2は唯一の偶数の素数であり、それ以外の素数はすべて奇数になります。 実行例 以下に入力と出力の例を示します。 入力 入力値が次のとおりであるとします。 開始番号 : 1 終了番号 : 75

  2. Javaで2つの整数の間のアームストロング数を求める方法

    この記事では、Javaを使って指定した2つの数値の間に存在するアームストロング数(Armstrong数)をすべて表示する方法を解説します。アームストロング数とは?アームストロング数とは、各桁の数字を取り出して3乗し、その合計が元の数と等しくなる数のことです。より一般的に定義すると、n桁の整数の各桁を分離して3乗し、合計した結果が元の数と一致する場合、その整数はアームストロング数と呼ばれます。数式で表すと次のようになります。abcd... = a³ + b³ + c³ + d³ + ...3桁のアームストロング数の場合、各桁の3乗の合計がその数そのものと一致します。例1:153の場合153 =