문제
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 |