Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 3차원 공간의 네 점이 동일 평면 위에 있는지 확인하는 프로그램


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

아래 첫 번째 이미지는 네 점이 모두 xy 평면 위에 위치한 경우입니다. 이처럼 모든 점이 한 평면에 있으면 공면입니다.

C++로 3차원 공간의 네 점이 동일 평면 위에 있는지 확인하는 프로그램

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

C++로 3차원 공간의 네 점이 동일 평면 위에 있는지 확인하는 프로그램

판별 원리

기준 점 하나에서 나머지 두 점을 향하는 두 개의 벡터를 만든 뒤, 이 벡터들의 외적(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