3차원 공간상의 네 점 (x1, y1, z1), (x2, y2, z2), (x3, y3, z3), (x4, y4, z4)가 주어졌을 때, 이 점들이 모두 같은 평면 위에 놓여 있는지, 즉 공면(coplanar)인지 판별하는 것이 이 글의 목표입니다. 네 절점이 하나의 평면 안에 모두 포함되면 공면이라고 하며, 서로 다른 평면들에 걸쳐 있다면 공면이 아니라고 합니다.
아래 첫 번째 이미지는 네 점이 모두 xy 평면 위에 위치한 경우입니다. 이처럼 모든 점이 한 평면에 있으면 공면입니다.

두 번째 이미지는 네 점이 서로 다른 평면에 흩어져 있는 경우로, 이때는 공면이 아닙니다.

판별 원리
기준 점 하나에서 나머지 두 점을 향하는 두 개의 벡터를 만든 뒤, 이 벡터들의 외적(cross product)을 계산하면 평면의 법선 벡터 (a, b, c)를 얻을 수 있습니다. 이를 바탕으로 평면의 방정식을 ax + by + cz + d = 0 형태로 세울 수 있으며, 마지막 점을 이 식에 대입했을 때 결과가 0이면 그 점 역시 같은 평면 위에 있는 것입니다.
예시
Input-: x1 = 2, y1 = 3, z1 = 1, x2 = 1, y2 = 9, z2 = 3, x3 = 3, y3 = 1, z3 = 5, x4 = 23, y4 = 21, z4 = 9 Output-: they are not coplanar Input-: x1 = 3, y1 = 2, z1 = -5, x2 = -1, y2 = 4, z2 = -3, x3 = -3, y3 = 8, z3 = -5, x4 = -3, y4 = 2, z4 = 1 Output-: they are coplanar
프로그램에서 사용하는 접근 방법은 다음과 같습니다.
- 네 점의 좌표를 변수 (x1, y1, z1), (x2, y2, z2), (x3, y3, z3), (x4, y4, z4)에 입력받습니다
- 점 세 개로 평면의 방정식을 구하고, 나머지 점이 그 조건을 만족하는지 검사합니다
- 검사 결과에 따라 점들이 공면인지 아닌지 출력합니다
알고리즘
START
Step 1-> 3차원 점들의 공면 여부를 확인하는 함수 선언
void check_coplanar(int x1,int y1,int z1,int x2,int y2,int z2, int x3, int y3, int z3, int x, int y, int z)
변수 int a1 = x2 - x1 선언
변수 int b1 = y2 - y1 선언
변수 int c1 = z2 - z1 선언
변수 int a2 = x3 - x1 선언
변수 int b2 = y3 - y1 선언
변수 int c2 = z3 - z1 선언
변수 int a = b1 * c2 - b2 * c1 선언
변수 int b = a2 * c1 - a1 * c2 선언
변수 int c = a1 * b2 - b1 * a2 선언
변수 int d = (- a * x1 - b * y1 - c * z1) 선언
검사
IF(a * x + b * y + c * z + d == 0)
coplanar 출력
End
Else
not coplanar 출력
End
Step 2-> main() 함수에서
변수 선언 및 초기화: int x1 = 2 , y1 = 3, z1 = 1, x2 = 1, y2 = 9, z2 = 3, x3 = 3, y3 = 1, z3 = 5, x4 = 23, y4 = 21, z4 = 9
check_coplanar(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4) 호출
STOP
C++ 코드 예제
#include<bits/stdc++.h>
using namespace std ;
//평면 위의 점들이 공면인지 계산하는 함수
void check_coplanar(int x1,int y1,int z1,int x2,int y2,int z2, int x3, int y3, int z3, int x, int y, int z) {
int a1 = x2 - x1 ;
int b1 = y2 - y1 ;
int c1 = z2 - z1 ;
int a2 = x3 - x1 ;
int b2 = y3 - y1 ;
int c2 = z3 - z1 ;
int a = b1 * c2 - b2 * c1 ;
int b = a2 * c1 - a1 * c2 ;
int c = a1 * b2 - b1 * a2 ;
int d = (- a * x1 - b * y1 - c * z1) ;
if(a * x + b * y + c * z + d == 0)
cout << "they are coplanar" << endl;
else
cout << "they are not coplanar" << endl;
}
int main() {
int x1 = 2;
int y1 = 3 ;
int z1 = 1 ;
int x2 = 1 ;
int y2 = 9 ;
int z2 = 3 ;
int x3 = 3 ;
int y3 = 1 ;
int z3 = 5 ;
int x4 = 23 ;
int y4 = 21 ;
int z4 = 9 ;
check_coplanar(x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4) ;
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
they are not coplanar