선분 교차 2

난이도

Gold 2

인증

문제

2차원 좌표 평면 위의 두 선분 L1, L2가 주어졌을 때, 두 선분이 교차하는지 아닌지 구해보자. 한 선분의 끝 점이 다른 선분이나 끝 점 위에 있는 것도 교차하는 것이다.

L1의 양 끝 점은 (x1, y1), (x2, y2), L2의 양 끝 점은 (x3, y3), (x4, y4)이다.

입력

첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다.

출력

L1과 L2가 교차하면 1, 아니면 0을 출력한다.

제한

-1,000,000 ≤ x1, y1, x2, y2, x3, y3, x4, y4 ≤ 1,000,000 x1, y1, x2, y2, x3, y3, x4, y4는 정수 선분의 길이는 0보다 크다.

예제 입력

1 1 5 5
1 5 5 1

예제 출력

1

해설 및 후기

선분 교차 1과 유사하나 결정적인 부분이 다르다. 각 점을 이루는 선분들이 일직선을 형성할 수 있다는 것이다. 이러한 경우에는 우선 ccw가 모두 0인지를 판정 후에(모두 일직선), 선분이 포개어져있는가를 분기문으로 추가해 해결할 수 있다.

제출 코드

x1, y1, x2, y2 = map(int,input().split())
x3, y3, x4, y4 = map(int,input().split())

def ccw(a,b,c):
    res = (b[0]-a[0])*(c[1]-a[1])-(c[0]-a[0])*(b[1]-a[1])
    return res
a = ccw([x1,y1],[x2,y2],[x3,y3])*ccw([x1,y1],[x2,y2],[x4,y4])
b = ccw([x3,y3],[x4,y4],[x1,y1])*ccw([x3,y3],[x4,y4],[x2,y2])
if(a == 0 and b == 0):
    if min(x1, x2) <= max(x3, x4) and min(x3, x4) <= max(x1, x2) and min(y1, y2) <= max(y3, y4) and min(y3, y4) <= max(y1, y2):  
        print(1)
    else:
        print(0)
elif(a <= 0 and b <= 0):
    print(1)
else:
    print(0)