알고리즘/백준
[Algorithm] CCW
래울
2024. 4. 6. 23:13
Counter Clock Wise
점 A, B, C가 있을 때 3개의 점 A, B, C를 차례로 이은 직선의 모양을 알고자 할 때 유용한 기하 알고리즘이다.
세 점에 대해 다음의 3 가지 모양이 존재할 수 있다.
귀찮으니까 코드로 보자.
AB와 BC 벡터를 구하고, 벡터를 Cross (외적) 연산하면 세 점 A, B, C의 관계를 알 수 있다.
반시계 방향 : 음수
시계 방향 : 양수
직선 : 0
#include <iostream>
using namespace std;
struct xy {
int y, x;
};
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
xy A, B, C;
cin >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y;
xy AB = { B.y - A.y, B.x - A.x };
//cout << AB.y << AB.x <<"\n";
xy BC = { C.y - B.y, C.x - B.x };
//cout << BC.y << BC.x <<"\n";
int r = AB.x* BC.y - AB.y * BC.x;
//cout << r;
if (r > 0)cout << 1;
else if (r < 0) cout << -1;
else cout << 0;
return 0;
}
https://www.acmicpc.net/problem/11758
11758번: CCW
첫째 줄에 P1의 (x1, y1), 둘째 줄에 P2의 (x2, y2), 셋째 줄에 P3의 (x3, y3)가 주어진다. (-10,000 ≤ x1, y1, x2, y2, x3, y3 ≤ 10,000) 모든 좌표는 정수이다. P1, P2, P3의 좌표는 서로 다르다.
www.acmicpc.net