알고리즘

[알고리즘] 벡터의 외적

P1su 2024. 7. 9. 22:10

벡터란 크기와 방향을 가지는 물리량이다. 

길이와 방향성을 지니는 선분이라 생각하면 된다. 

 

벡터의 외적 구하기

외적은 두 벡터에 대해 수직인 벡터를 구하는 연산이다. 

pair<int, int> x = make_pair(2, 5);
pair<int, int> y = make_pair(4, -2);

int tmp = x.first * y.second - x.second * y.first;

 

CCW 알고리즘

벡터의 외적을 응용한 알고리즘이다. 

세 점이 주어졌을 때, 외적의 부호를 판단하여 세 점의 방향성을 확인할 수 있다.

점 A를 기준으로 세 점의 방향성을 구해보자. 

두 벡터 AB 와 AC의 외적의 부호를 통하여 이를 결정할 수 있다. 

세 점을 A(x1, y1), B(x2, y2), C(x3, y3) 라 하면

두 벡터는 (x2- x1, y2 - y1), (x3 - x1, y3 - y1) 이라 할 수 있다. 

이를 외적 공식에 대입하면

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

으로 표현할 수 있다. 

 

이때 그 값이 음수일 경우 세 점은 시계 방향, 양수일 경우는 반시계 방향이다. 

long long ccw(pair<long long, long long>p1, pair<long long, long long>p2, pair<long long, long long>p3) {
	long long s = p1.first * p2.second + p2.first * p3.second + p3.first * p1.second;
	s -= (p1.second * p2.first + p2.second * p3.first + p3.second * p1.first);

	if (s > 0) return 1;
	else if (s == 0) return 0;
	else return -1;
}

 

코드는 다음과 같이 표현할 수 있다. 

728x90