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

C++에서 세 점이 한 직선 위에 있는지(공선 여부) 확인하는 프로그램

문제 개요

서로 다른 좌표 값을 가진 세 개의 점이 주어졌을 때, 이 점들이 공선(collinear)인지 아닌지 판별해야 합니다.

세 점이 모두 같은 직선 위에 있으면 '공선점'이라고 부르고, 각기 다른 직선 위에 있다면 공선점이 아니라고 합니다. 아래 그림은 공선점과 비공선점의 예를 보여줍니다.

C++에서 세 점이 한 직선 위에 있는지(공선 여부) 확인하는 프로그램

입력

x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5

출력

no points are not collinear

입력

x1 = 1, y1 = 1, x2 = 1, y2 = 4, x3 = 1, y3 = 5

출력

points are collinear

핵심 원리: 삼각형의 넓이

세 점으로 삼각형을 만들 수 없다면, 즉 세 점이 이루는 삼각형의 넓이가 0이라면 세 점은 한 직선 위에 있는 것입니다. 반대로 넓이가 0이 아니라면 세 점은 서로 다른 직선 위에 있는 것이므로 공선점이 아닙니다. 따라서 다음 공식으로 계산한 값이 0인지만 확인하면 됩니다.

x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)

프로그램의 접근 방식

  • 점을 (x1, y1), (x2, y2), (x3, y3) 형태로 입력받습니다.
  • 삼각형 넓이 공식 x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)를 적용합니다.
  • 다음 조건을 검사합니다.
    • 삼각형의 넓이가 0이면 "점들은 공선점입니다"를 출력합니다.
    • 삼각형의 넓이가 0이 아니면 "점들은 공선점이 아닙니다"를 출력합니다.
  • 최종 결과를 출력합니다.

알고리즘

시작
단계 1→ 점들의 공선 여부를 확인하는 함수 선언
    void check_collinear(int x1, int y1, int x2, int y2, int x3, int y3)
        int a = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2) 선언
        IF (a == 0)
            "yes points are collinear" 출력
        End
        Else
            "no points are not collinear" 출력
단계 2→ main() 함수에서
    int x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5 선언
    check_collinear(x1, y1, x2, y2, x3, y3) 호출
종료

예제 코드

#include <bits/stdc++.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
//점들이 공선점인지 확인하는 함수
void check_collinear(int x1, int y1, int x2, int y2, int x3, int y3){
   int a = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2);
   if (a == 0)
      cout << "yes points are collinear";
   else
      cout << "no points are not collinear";
}
int main(){
   int x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5;
   check_collinear(x1, y1, x2, y2, x3, y3);
   return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

no points are not collinear

즉, (1, 1), (2, 4), (3, 5) 세 점은 계산된 값이 0이 아니므로 한 직선 위에 있지 않습니다. 만약 세 점이 같은 직선 위에 있다면 계산 결과가 0이 되어 "points are collinear"가 출력됩니다.