본문 바로가기

Algorithm

CCW

반응형

세 점이 시계방향인지 평행하는지 반시계방향인지 확인할때 쓰는방법 

 

또한 ccw의 크기의 /2 는 세점으로 하는 삼각형의 크기라는 것을 알 수 있다.

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
package algo;
 
import java.util.Scanner;
 
public class B11758 {
    static class Pair {
        int y;
        int x;
 
        public Pair(int x, int y) {
            super();
            this.y = y;
            this.x = x;
        }
    }
 
    static int ccw(Pair a, Pair b, Pair c) {
        int op = a.x * b.y + b.x * c.y + c.x * a.y;
        op -= (a.y * b.x + b.y * c.x + c.y * a.x);
 
        // 반시계 방향
        if (op > 0)
            return 1;
        // 평행
        else if (op == 0)
            return 0;
        // 시계 방향
        else
            return -1;
 
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Pair a = new Pair(sc.nextInt(), sc.nextInt());
        Pair b = new Pair(sc.nextInt(), sc.nextInt());
        Pair c = new Pair(sc.nextInt(), sc.nextInt());
        System.out.println(ccw(a, b, c));
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

이걸가지고 여러 기하학 문제들을 풀 수 있다

 

 

import java.util.Scanner;

public class Main {
	static class Pair {
		long y;
		long x;

		public Pair(long x, long y) {
			super();
			this.y = y;
			this.x = x;
		}

		public boolean cmp(Pair o) {
			if (y > o.y)
				return true;
			if (y == o.y) {
				if (x > o.x)
					return true;
			}
			return false;
		}
	}

	static long ccw(Pair a, Pair b, Pair c) {
		long op = a.x * b.y + b.x * c.y + c.x * a.y;
		op -= (a.y * b.x + b.y * c.x + c.y * a.x);

		// 반시계 방향
		if (op > 0)
			return 1;
		// 시계방향
		else if (op == 0)
			return 0;
		else
			return -1;

	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		Pair a = new Pair(sc.nextLong(), sc.nextLong());
		Pair b = new Pair(sc.nextLong(), sc.nextLong());
		Pair c = new Pair(sc.nextLong(), sc.nextLong());
		Pair d = new Pair(sc.nextLong(), sc.nextLong());

		if (Solve(a, b, c, d))
			System.out.println(1);
		else
			System.out.println(0);
	}


	public static boolean Solve(Pair a, Pair b, Pair c, Pair d) {
		long abc = ccw(a, b, c);
		long abd = ccw(a, b, d);
		long cda = ccw(c, d, a);
		long cdb = ccw(c, d, b);

		if (abc * abd == 0 && cda * cdb == 0) {
			if (a.cmp(b)) {
				Pair tmp = a;
				a = b;
				b = tmp;
			}

			if (c.cmp(d)) {
				Pair tmp = c;
				c = d;
				d = tmp;
			}
			
			return b.cmp(c);
		}

		return abc * abd <= 0 && cda * cdb <= 0;
	}
}
 

 

반응형