BOJ C++ 알고리즘 공부
[기하학] CCW(11758) (C/C++)
kk_eezz
2022. 2. 12. 16:23
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
1. 문제 개요
2차원 좌표 평면 위에 있는 점 3개 P1, P2, P3가 주어질때 이를 순서대로 이은 선분이 어떤 방향을 이루고 있는지 구하는 문제.
2. 입출력
3. 문제 풀이
첫번째, 두번째 점을 이용하여 직선의 방정식을 구하고, 세번째 점을 방정식에 대입했을 때 양수가 나오면 반시계 방향,
음수가 나오면 시계 방향, 0이 나오면 일직선이다.
4. 전체 코드
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <cmath>
using namespace std;
//선분
int a, b, c;
int equation(int x, int y){ // 직선의 방정식에 점을 대입하는 함수
int result = a*x + y*b +c;;
if(result > 0){
return 1;
} else if(result < 0) {
return -1;
} else {
return 0;
}
}
int main(void)
{
vector<pair<int, int>> p;
p.resize(3);
for(int i=0;i<3;i++){
scanf("%d%d",&p[i].first,&p[i].second);
}
a = p[0].second - p[1].second;
b = p[1].first - p[0].first;
c = (p[0].first-p[1].first)*p[0].second + (p[1].second-p[0].second)*p[0].first;
// p[0]과 p[1]를 지나는 직선의 방정식을 구한다.
// ax + by + c = 0
printf("%d\n",equation(p[2].first, p[2].second));
return 0;
}