C++で3次元空間における2つの平面間の角度を計算する方法
本記事では、3次元空間内にある2つの平面 P1 と P2 の間の角度を求める方法を解説します。
平面の方程式と角度の公式
平面 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° から引くことで補角を求めることも可能です。
-
Javaで2つの区間の間にある素数を表示するプログラム
この記事では、指定した2つの区間(範囲)の間にある素数を表示するJavaプログラムの作成方法について解説します。素数とは、1とその数自身の2つだけを約数に持ち、それ以外のどの数でも割り切ることのできない特別な数です。 ある数が素数であるのは、その約数が1とその数自身だけである場合です。たとえば11は素数であり、その約数は1と11のみです。素数の例としては、2、3、5、7、11、13などが挙げられます。なお、2は唯一の偶数の素数であり、それ以外の素数はすべて奇数になります。 実行例 以下に入力と出力の例を示します。 入力 入力値が次のとおりであるとします。 開始番号 : 1 終了番号 : 75
-
Javaで2つの整数の間のアームストロング数を求める方法
この記事では、Javaを使って指定した2つの数値の間に存在するアームストロング数(Armstrong数)をすべて表示する方法を解説します。アームストロング数とは?アームストロング数とは、各桁の数字を取り出して3乗し、その合計が元の数と等しくなる数のことです。より一般的に定義すると、n桁の整数の各桁を分離して3乗し、合計した結果が元の数と一致する場合、その整数はアームストロング数と呼ばれます。数式で表すと次のようになります。abcd... = a³ + b³ + c³ + d³ + ...3桁のアームストロング数の場合、各桁の3乗の合計がその数そのものと一致します。例1:153の場合153 =