다각형 자르기

시간 제한1초메모리 제한128 MB

요약
주어진 단순 다각형과 여러 직선 각각에 대해, 직선과 다각형의 교집합 전체 길이를 구한다.
난이도

보통10점 중 7점

유형
기하, 구현, 정렬, 완전 탐색
정답자
아직 제출이 없습니다

문제

평면 위에 단순 다각형(볼록하지 않을 수도 있다) 하나와 직선 하나가 주어진다. 이 직선을 따라 다각형을 자르면 여러 개의 작은 다각형으로 나뉠 수 있다. 자른 길이, 즉 직선과 다각형의 교집합을 이루는 선분들의 전체 길이를 구하여라.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 두 음이 아닌 정수 nn과 mm이 주어지며 (3≤n≤10003 \le n \le 1000), 각각 다각형의 꼭짓점 개수와 고려할 절단 직선의 개수를 뜻한다. 이어지는 nn개의 줄에는 각 꼭짓점의 xx, yy 좌표가 시계 방향 또는 반시계 방향 순서로 주어진다. 그다음 mm개의 줄에는 각각 네 개의 수 x1 y1 x2 y2x_1\ y_1\ x_2\ y_2가 주어지며, 이는 절단 직선을 정의하는 서로 다른 두 점의 좌표이다. 다각형의 어떤 꼭짓점이 절단 직선으로부터 10e-8보다 가까이 있으면, 그 꼭짓점은 직선 위에 있는 것으로 간주한다. 입력은 nn과 mm이 모두 00인 줄로 끝나며, 이 줄은 처리하지 않는다.

출력

각 절단 직선에 대해, 직선과 다각형의 교집합을 이루는 선분들의 전체 길이를 소수점 아래 정확히 셋째 자리까지 반올림하여 한 줄에 하나씩 출력한다. 다각형의 둘레(경계)는 다각형에 포함되는 것으로 본다.

힌트

다각형의 둘레가 다각형에 포함되므로, 절단 직선과 완전히 겹치는 변은 그 변의 길이만큼 교집합에 더해진다. 반면 직선이 다각형과 단 하나의 꼭짓점에서만 만나는 경우, 그 교집합의 길이는 00이다.

예제1

  1. 예제 1

    입력
    9 5
    0 0
    0 2
    1 1
    2 2
    3 1
    4 2
    5 1
    6 2
    6 0
    -1 2 7.5 1
    0 1 6 1
    0 1.5 6 1.5
    0 2 6 1
    0 0 0 2
    0 0
    
    예상 출력
    2.798
    6.000
    3.000
    2.954
    2.000