세 점이 있을 때 반시계 방향으로 움직이는지, 시계방향으로 움직이는지 찾는 알고리즘이다.
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 |
'개발레시피 > └ Algorithm' 카테고리의 다른 글
[알고리즘 정리노트] 기하 (0) | 2018.03.24 |
---|---|
[알고리즘 정리노트] 그래프 (0) | 2018.03.14 |
[기하/개념] 볼록 껍질 (Convex Hull) (0) | 2017.12.01 |
[그래프/개념] 그래프 사이클 찾기 (방향, 무방향), DFS Cycle java (0) | 2017.11.18 |
[그래프/개념] 최소 스패닝 트리(Minimum Spanning Tree), 크루스칼 알고리즘 (0) | 2017.11.16 |
Comments