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;
}