Blog Content

    티스토리 뷰

    CCW 판별법 (Java)

    세 점이 있을 때 반시계 방향으로 움직이는지, 시계방향으로 움직이는지 찾는 알고리즘이다.

    2차원 좌표에 세 점 A,B,C가 있다고 가정했을 때

    AB 기준으로 C가 왼쪽에 위치해있다고 했을 때

    벡터의 외적을 계산하면 d[AB, AC] > 0 이 나오고,

    AB기준으로 C가 오른쪽에 위치해있다고 했을 때

    d[AB, AC] < 0이 나온다.


    즉, 벡터의 외적의 값이 0 초과이면 ccw(반시계방향),

    0미만이면 cw(시계방향), 0이면 일직선상에 존재한다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
     
    /*2차원 좌표 평면 위에 있는 점 3개 P1,P2,P3이 주어진다. 
    P1,P2,P3을 순서대로 이은 선분이 어떤 방향을 이루고 있는지 구하는 프로그램을 작성하시오*/
    public class CCW {
        private static class Point {
            int x;
            int y;
        }
     
        public static void main(String[] args) throws Exception {
            Point A = new Point();
            Point B = new Point();
            Point C = new Point();
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String[] line = br.readLine().split(" ");
            A.x = Integer.valueOf(line[0]);
            A.y = Integer.valueOf(line[1]);
            line = br.readLine().split(" ");
            B.x = Integer.valueOf(line[0]);
            B.y = Integer.valueOf(line[1]);
            line = br.readLine().split(" ");
            C.x = Integer.valueOf(line[0]);
            C.y = Integer.valueOf(line[1]);
            
            System.out.println(ccw(A, B, C));
        }
     
        private static int ccw(Point A, Point B, Point C) {
            int value = (A.x*B.y + B.x*C.y + C.x*A.y) - (A.y*B.x + B.y*C.x + C.y*A.x);
            if(value ==0)    return 0//일직선
            else if(value>0)    return 1// 반시계방향
            else    return -1//시계방향
        }
     
    }
    cs


    Comments