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

행렬식(Determinant)을 이용해 삼각형의 넓이를 구하는 C++ 프로그램

행렬식으로 삼각형 넓이 구하기

이번 글에서는 2차원 좌표 공간에서 행렬식(determinant)을 활용해 삼각형의 넓이를 구하는 방법을 알아보겠습니다. 삼각형을 이루는 세 점의 좌표를 하나의 행렬에 배치하는데, 첫 번째 열에는 x값, 두 번째 열에는 y값을 넣고 세 번째 열에는 모두 1을 채웁니다. 그다음 이 행렬의 행렬식을 계산하면 되는데, 삼각형의 넓이는 행렬식 값의 절반이 됩니다. 만약 행렬식이 음수로 나오더라도 단순히 절댓값을 취해 주면 됩니다.

$$Area\:=\:absolute\:of\begin{pmatrix}\frac{1}{2} \begin{vmatrix} x_1\:\:y_1\:\:1 \\ x_2\:\:y_2\:\:1 \\ x_3\:\:y_3\:\:1 \end{vmatrix} \end{pmatrix}$$

여기서는 3×3 행렬을 가정하고 있으므로, 아래에서 소개할 행렬식 함수는 크기가 3×3이 아닌 행렬에는 사용할 수 없습니다.

예제 코드

#include<iostream>
#include<cmath>
using namespace std;
double det(double M[3][3]) {
    double t1 = (M[1][1] * M[2][2]) - (M[1][2] * M[2][1]);
    double t2 = (M[1][0] * M[2][2]) - (M[1][2] * M[2][0]);
    double t3 = (M[1][0] * M[2][1]) - (M[1][1] * M[2][0]);
    return (M[0][0]*t1) + (-M[0][1]*t2) + (M[0][2]*t3);
}
int main() {
    double M[3][3];
    cout << "Enter Point p1 (x, y):";
    cin >> M[0][0] >> M[0][1];
    M[0][2] = 1;
    cout << "Enter Point p2 (x, y):";
    cin >> M[1][0] >> M[1][1];
    M[1][2] = 1;
    cout << "Enter Point p3 (x, y):";
    cin >> M[2][0] >> M[2][1];
    M[2][2] = 1;
    double determinant = det(M);
    cout << "The area is: " << fabs(determinant) * 0.5;
    return 0;
}

코드 설명

  • det() 함수: 첫 번째 행을 기준으로 여인수 전개(cofactor expansion)를 수행하여 3×3 행렬의 행렬식을 계산합니다.
  • 행렬 구성: 사용자로부터 세 점의 (x, y) 좌표를 입력받고, 각 행의 세 번째 열에 자동으로 1을 채워 3×3 행렬을 완성합니다.
  • 넓이 계산: cmath 헤더의 fabs() 함수로 행렬식의 절댓값을 구한 뒤 0.5를 곱해 최종 넓이를 출력합니다.

실행 결과

Enter Point p1 (x, y):3 4
Enter Point p2 (x, y):6 4
Enter Point p3 (x, y):3 9
The area is: 7.5

결과 검증

세 점 (3, 4), (6, 4), (3, 9)로 이루어진 삼각형은 밑변의 길이가 3(= 6 − 3), 높이가 5(= 9 − 4)이므로 일반적인 넓이 공식 (밑변 × 높이) ÷ 2 = (3 × 5) ÷ 2 = 7.5로 계산되며, 행렬식을 이용한 결과와 정확히 일치합니다.