알고리즘/코테

[백준 17386] 선분 교차 1

kiwiiiv 2022. 3. 8. 22:34

https://www.acmicpc.net/problem/17386

 

17386번: 선분 교차 1

첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다. 세 점이 일직선 위에 있는 경우는 없다.

www.acmicpc.net

 

 

 

작년 알설 수업 때 배웠던 거다...

근데 문제 풀때 하나도 기억 안났음

당연히 그 때 관련 문제를 안풀었고 공식만 외웠으니까!!!!!!!

 

그래서 다시 구글링을 해서 공부를 해봤다.

 

CCW(CounterClockWise)

세 점에 대한 방향을 나타냄.

 

점 A, B, C가 있을 때, 세 가지 경우가 존재한다

 

 

 

1)

A->B 방향이 B->C 방향에 대해 반시계 방향인 경우

 

 

2)

A->B 방향이 B->C 방향에 대해 시계 방향인 경우

 

 

 

3)

세 점이 평행한 경우

 

 

 

 

 

위 선분들의 방향을 계산하는 CCW 값은 다음과 같다. (이 식은 외적에 의하여 계산됨.)

 

(Bx - Ax)(Cy - Ay) - (By - Ay)(Cx - Ax)

 

1)의 반시계 경우에는 0보다 큰 값이,

2)의 시계 경우에는 0보다 작은 값이,

3) 평행한 경우에는 0의 값으로 계산해 낼 수 있다.

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

class Main {

    public static void main(String args[]) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        double segment1[] = new double[4];
        double segment2[] = new double[4];
        String line = br.readLine();
        segment1 = Arrays.stream(line.split(" ")).mapToDouble(Double::parseDouble).toArray();
        line = br.readLine();
        segment2 = Arrays.stream(line.split(" ")).mapToDouble(Double::parseDouble).toArray();

        if(isCross(segment1,segment2) && isCross(segment2,segment1))
            System.out.println(1);
        else
            System.out.println(0);
    }

    private static boolean isCross(double arr1[], double arr2[]) {
        boolean flag1=(arr1[0]*arr1[3]+arr1[2]*arr2[1]+arr2[0]*arr1[1]
                        -arr1[2]*arr1[1]-arr2[0]*arr1[3]-arr1[0]*arr2[1])>0;
        boolean flag2=(arr1[0]*arr1[3]+arr1[2]*arr2[3]+arr2[2]*arr1[1]
                -arr1[2]*arr1[1]-arr2[2]*arr1[3]-arr1[0]*arr2[3])>0;

        return flag1 ^ flag2;
    }
}

 

 

 


https://jason9319.tistory.com/358

 

CCW와 CCW를 이용한 선분 교차 판별

PS에서 종종 이용되는 선분 교차 여부 판별을 CCW를 이용하여 비교적 간단(?)하게 할 수 있는 방법을 소개하려고 합니다. 그 전에 우선 CCW에 대하여 이야기 해보겠습니다. CCW는 Counterclockwise의 약자

jason9319.tistory.com

 

CCW에 대한 정의

https://degurii.tistory.com/47

 

[알고리즘] CCW로 세 점의 방향성 판별하기

0. 들어가기 전에 첫 알고리즘 포스트입니다. 이번에 쓸 내용은 CCW입니다. 원래는 기하 알고리즘들을 전반적으로 다루려고 했는데 생각보다 글이 길어져서 CCW만 쓰게 되었습니다. 본 글의 내용

degurii.tistory.com