불행히도 여전히 스위프 라인 알고리즘 을 이해하는 데 그리 강하지 않습니다 . 주제에 관한 모든 논문과 교과서는 이미 읽었지만 이해는 아직 멀다. 더 명확하게하기 위해 가능한 많은 운동을 해결하려고합니다. 그러나 정말 흥미롭고 중요한 작업은 여전히 어려운 과제입니다.
다음 운동 은 전능 한 Jeff Erickson 의 Line Segment Intersection 강의 노트에서 발견되었습니다 .
연습 2. 스윕 라인 알고리즘을 설명하고 분석 하여 평면에 원이있을 때 O ( n log n ) 시간 에 2 개의 교차점이 있는지 확인합니다 . 각 원은 중심과 반지름으로 지정되므로 입력은 3 개의 배열 X [ 1 .. n ] , Y [ 1 .. n ] 및 됩니다. 하위 레벨 기본 요소를 올바르게 구현하도록주의하십시오.
복잡한 것을 더 쉽게 만들어 봅시다. 우리는 원의 교차점에 대해 무엇을 알고 있습니까? 선의 교차로 어떤 아날로그를 찾을 수 있습니다. 두 선이 서로 인접한 경우 교차 할 수 있습니다. 두 원이 교차해야하는 속성은 무엇입니까? 하자는 원의 중심 사이의 거리 및 원의 중심. 몇 가지 경우를 고려하십시오.r 0 r 1
사례 1 : 경우 해가 없으면 원이 분리됩니다.
사례 2 :하나의 원이 다른 원 안에 포함되어 있기 때문에 해결책이 없습니다.
사례 3 : 이고 이면 원은 일치하며 무한한 수의 솔루션이 있습니다.r 0 = r 1
따라서 교차 조건이 준비된 것처럼 보이지만 물론 잘못된 조건 일 수 있습니다. 그렇다면 수정하십시오.
연산. 이제 우리는 두 개의 교차하는 원 사이에서 공통점이있는 것을 찾아야합니다. 아날로그-라인 교차로를 사용하려면 이벤트 큐에 삽입 조건과 삭제 조건이 있어야합니다. 이벤트 포인트는 수직 스위프 라인이 닿는 첫 번째 포인트와 마지막 포인트의 x 좌표입니다. 첫 번째 지점에서 원을 상태에 삽입 하고 가장 가까운 원과의 교차점 (위에서 3 가지 경우를 언급 함)을 확인하고 마지막 지점에서 원을 status 에서 삭제 합니다 .
스위프 라인 알고리즘으로는 충분합니다. 문제가 있거나 다르게해야 할 일이있을 경우 자유롭게 의견을 공유하십시오.
부록 :
수직 스윕 선이 처음 원에 닿으면 원을 삽입하고 스윕 선이 마지막으로 원에 닿을 때 상태에서 원을 제거합니다. 가장 가까운 이전 원에 대해 교차점을 확인해야합니다. 우리는에 원을 추가 한 경우 상태를 우리가 이전에 추가 된 또 다른 원은 이미 있었고 따라서 통과시키는 원이 너무 교차로가있을 수 있습니다, "폐쇄"하지 않았다, 아직 거기에 있었다.
status
현재 스윕 라인을 교차하는 원 을 유지 한다고 가정 합니까? 현재에 100 개의 원이 status
있고 삽입 이벤트를 처리하고 101 번째 원을 삽입 한다고 가정합니다 . 교차점을 확인하기 위해 몇 개의 원을 비교합니까? 비교할 서클을 어떻게 선택합니까?