본문 바로가기

Algorithm Problems/기하학

[백준/C++] 11758번: CCW

문제

https://www.acmicpc.net/problem/11758


문제 요약

2차원 좌표 평면 위에 p1, p2, p3 점 3개의 좌표가 주어진다.

 

p1, p2, p3를 순서대로 이은 선분이 어떤 방향을 이루고 있는지 출력한다.


코드

#include <iostream>

using namespace std;

int x_1, x_2, x_3, y_1, y_2, y_3;

int main() {
    cin >> x_1 >> y_1 >> x_2 >> y_2 >> x_3 >> y_3;

    int result = ((x_2 - x_1) * (y_3 - y_1)) - ((y_2 - y_1) * (x_3 - x_1));

    if (result == 0) {
        cout << 0;
    }
    else if (result > 0) {
        cout << 1;
    }
    else {
        cout << -1;
    }

}

코드 설명

CCW 알고리즘을 이용한다.

 

CCW란, 점 C가 선분 AB에 왼쪽에 있는지, 오른쪽에 있는지 구분하는 방법이다.(즉, 좌회전과 우회전을 구분할 수 있다.)

 

CCW를 구하는 방법은 벡터 AB와 벡터 AC의 외적을 구하고 부호를 점검하면된다.

 

점 A(x1, y1), 점 B(x2, y2),  점 A(x3, y3) 이 존재할 때, 

 

벡터 AB: (x2 - x1, y2 - y1)

벡터 AC: (x3 - x1, y3 - y1)

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

 

이다.

 

위 식의 결과 값이 양수라면, 반시계방향, 음수라면 시계 방향, 0이면 평행이다.


고찰

C++ 에서 y1이라는 변수는 이미 표준 라이브러리에서 정의된 함수 이름이므로 정의될 수 없다.

'Algorithm Problems > 기하학' 카테고리의 다른 글

[백준/C++] 2166번: 다각형의 면적  (1) 2024.07.19
[백준/C++] 1002번: 터렛  (1) 2024.02.23