이 글에서는 3차원 공간에 존재하는 두 평면 사이의 각도를 계산하는 방법을 살펴보겠습니다. 두 개의 평면 P1과 P2가 있으며, 각 평면의 방정식은 다음과 같은 형태로 표현됩니다.
평면의 방정식
P1: a1x + b1y + c1z + d1 = 0
P2: a2x + b2y + c2z + d2 = 0
두 평면 사이의 각도는 각 평면의 법선 벡터(normal vector)를 이용해 구할 수 있습니다. 법선 벡터는 평면 방정식의 계수 (a, b, c)로 나타내며, 두 벡터 사이의 코사인 값을 계산하면 됩니다.
각도 계산 공식
두 평면 사이의 각도를 'A'라고 하면 다음 공식이 성립합니다.
cos A = |(a1a2 + b1b2 + c1c2)| ÷ (√(a1² + b1² + c1²) × √(a2² + b2² + c2²))
여기서 분자는 두 법선 벡터의 내적(dot product)이고, 분모는 각 벡터 크기의 곱입니다. 이 값을 acos 함수에 넣어 라디안을 구한 뒤 도(degree) 단위로 변환하면 최종 각도를 얻을 수 있습니다.
예제 코드
#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() 함수는 두 객체의 법선 벡터 성분을 사용하여 내적을 계산하고, 각 벡터의 크기를 곱한 값으로 나누어 코사인 값을 구합니다. 마지막으로 acos 함수로 역코사인을 적용하고, 라디안 값을 도 단위로 변환하기 위해 180/π를 곱합니다.
예제에서 사용된 두 평면은 2x + 2y − 3z − 5 = 0과 3x − 3y + 5z − 6 = 0이며, 프로그램을 실행하면 두 평면 사이의 각도인 약 123.697도가 출력됩니다.