개념
양쪽 선분에서 방향 확인하기
두 선분 , 가 교차하는지 확인하려면 다음 두 조건을 함께 확인합니다.
- 점 , 가 직선 의 서로 반대쪽에 있거나 직선 위에 있습니다.
- 점 , 가 직선 의 서로 반대쪽에 있거나 직선 위에 있습니다.
각 조건은 CCW 부호로 판별합니다. 양쪽 부호가 반대이거나 하나가 이면 그 조건을 만족합니다. 끝점끼리 닿거나 한 선분의 끝점이 다른 선분 위에 있는 경우도 교차에 포함합니다.
, , , 인 두 선분을 확인하겠습니다. 양쪽 선분 모두 기울어져 있고, 교점은 각 선분의 내부에 있습니다.
| 기준 직선 | 확인할 점 | 외적 |
|---|---|---|
각 기준 직선에서 두 외적의 부호가 반대이므로 두 선분은 교차합니다. 교점의 좌표를 직접 계산하지 않아도 교차 여부를 알 수 있습니다.
이제 , , , 로 바꾸겠습니다. 직선 에 대한 의 외적은 로 부호가 반대입니다. 그러나 직선 에 대한 의 외적은 으로 모두 양수입니다. 두 직선이 만나는 위치는 선분 의 끝점 를 벗어나므로 두 선분은 만나지 않습니다.
일직선인 경우
네 점이 한 직선 위에 있으면 방향 값이 모두 입니다. 이때는 두 선분이 실제로 겹치는 구간이 있는지 추가로 확인합니다.
각 선분의 좌표 범위와 좌표 범위를 구합니다. 두 축 모두에서 범위가 겹치면 교차합니다. 범위 , 의 겹침 조건은 다음과 같습니다.
겹치는 구간의 시작은 두 시작점 중 큰 값이고, 끝은 두 끝점 중 작은 값입니다. 시작이 끝 이하일 때 공통 구간이 존재하므로 위 부등식을 사용합니다. 예를 들어 와 은 에서 겹치고, 와 는 시작 후보 이 끝 후보 보다 커서 겹치지 않습니다.
아래 그림은 , , , 인 경우입니다. 네 점은 같은 비스듬한 직선 위에 있습니다. 좌표 범위는 과 , 좌표 범위는 과 입니다. 두 축의 범위가 모두 겹치므로 선분 가 공통 구간입니다.
방향 부호로 두 선분의 위치 관계를 먼저 확인하고, 일직선에서는 좌표 범위로 실제 길이가 겹치는지 확인합니다. 이 과정을 통해 끝점에서만 닿는 경우와 선분 일부가 포개지는 경우도 함께 판별합니다.
복잡도
고정된 두 선분을 기준으로 합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 선분 교차 판별 | 추가 |
예제
문제
주어진 두 선분이 교차하는지 판별하여라. 끝점에서 닿거나 일부가 겹치는 경우도 교차로 처리한다.
입력
첫째 줄에 첫 번째 선분의 양 끝점 좌표 가 공백을 사이에 두고 주어진다. 각 좌표는 이상 이하의 정수이며 두 끝점은 서로 다르다.
둘째 줄에 두 번째 선분의 양 끝점 좌표가 같은 형식과 범위로 주어진다.
출력
교차하면 YES, 아니면 NO를 출력한다.