이 글에서는 주어진 세 개의 점이 한 직선 위에 있는지(일직선상에 있는지) 판별하는 C++ 프로그램을 소개합니다.
판별 원리는 간단합니다. 세 점으로 삼각형을 만들었을 때 그 넓이가 0이라면, 세 점은 모두 한 직선 위에 있는 것입니다. 반대로 넓이가 0이 아니라면 세 점은 일직선상에 있지 않습니다.
세 점 (x1, y1), (x2, y2), (x3, y3)으로 만들 수 있는 삼각형의 넓이는 다음 공식으로 구합니다.
넓이 = 0.5 * (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2))
알고리즘
시작
세 점의 좌표를 무작위로 생성한다.
위의 공식을 사용해 삼각형의 넓이를 계산한다.
만약 넓이 > 0 이면
세 점은 직선 위에 있지 않다.
그렇지 않고 넓이 < 0 이면
세 점은 직선 위에 있지 않다.
그 외(넓이 = 0)의 경우
세 점은 직선 위에 있다.
끝예제 코드
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
static int L = 1; // 좌표 생성 범위의 최솟값
static int U = 20; // 좌표 생성 범위의 최댓값
int main(int argc, char **argv) {
int x3, y3, x1, x2, y1, y2;
time_t seconds;
time(&seconds);
srand((unsigned int) seconds);
// rand() 함수를 이용해 세 점의 좌표를 무작위로 생성
x1 = rand() % (U - L + 1) + L;
y1 = rand() % (U - L + 1) + L;
x2 = rand() % (U - L + 1) + L;
y2 = rand() % (U - L + 1) + L;
x3 = rand() % (U - L + 1) + L;
y3 = rand() % (U - L + 1) + L;
cout << "생성된 점: (" << x1 << ", " << y1 << "), (" << x2 << ", " << y2 << "), (" << x3 << ", " << y3 << ")\n";
// 삼각형의 넓이 계산
float a = 0.5 * (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2));
if (a != 0)
cout << "세 점은 직선 위에 있지 않습니다.";
else
cout << "세 점은 직선 위에 있습니다.";
}실행 결과
생성된 점: (20, 9), (6, 13), (13, 11) 세 점은 직선 위에 있습니다. 생성된 점: (9, 15), (4, 15), (11, 16) 세 점은 직선 위에 있지 않습니다.
코드에서는 srand()와 rand()를 사용해 1부터 20 사이의 정수 좌표를 무작위로 생성한 뒤, 앞서 설명한 넓이 공식을 적용합니다. 계산된 넓이가 0이 아니면 세 점이 일직선상에 있지 않다고 출력하고, 넓이가 정확히 0이면 세 점이 한 직선 위에 있다고 판단합니다.