스윕 라인 알고리즘을 사용한 원 교차


15

불행히도 여전히 스위프 라인 알고리즘 을 이해하는 데 그리 강하지 않습니다 . 주제에 관한 모든 논문과 교과서는 이미 읽었지만 이해는 아직 멀다. 더 명확하게하기 위해 가능한 많은 운동을 해결하려고합니다. 그러나 정말 흥미롭고 중요한 작업은 여전히 ​​어려운 과제입니다.

다음 운동 은 전능 한 Jeff Erickson 의 Line Segment Intersection 강의 노트에서 발견되었습니다 .

연습 2. 스윕 라인 알고리즘을 설명하고 분석 하여 평면에 원이있을 때 O ( n log n ) 시간 에 2 개의 교차점이 있는지 확인합니다 . 각 원은 중심과 반지름으로 지정되므로 입력은 3 개의 배열 X [ 1 .. n ] , Y [ 1 .. n ] 및 됩니다. 하위 레벨 기본 요소를 올바르게 구현하도록주의하십시오.영형(로그)엑스[1..],와이[1..]아르 자형[1..]

복잡한 것을 더 쉽게 만들어 봅시다. 우리는 원의 교차점에 대해 무엇을 알고 있습니까? 선의 교차로 어떤 아날로그를 찾을 수 있습니다. 두 선이 서로 인접한 경우 교차 할 수 있습니다. 두 원이 교차해야하는 속성은 무엇입니까? 하자는 원의 중심 사이의 거리 및 원의 중심. 몇 가지 경우를 고려하십시오.r 0 r 1아르 자형0아르 자형1

  • 사례 1 : 경우 해가 없으면 원이 분리됩니다.>아르 자형0+아르 자형1

  • 사례 2 :하나의 원이 다른 원 안에 포함되어 있기 때문에 해결책이 없습니다.<|아르 자형0아르 자형1|

  • 사례 3 : 이고 이면 원은 일치하며 무한한 수의 솔루션이 있습니다.r 0 = r 1=0아르 자형0=아르 자형1

따라서 교차 조건이 준비된 것처럼 보이지만 물론 잘못된 조건 일 수 있습니다. 그렇다면 수정하십시오.

연산. 이제 우리는 두 개의 교차하는 원 사이에서 공통점이있는 것을 찾아야합니다. 아날로그-라인 교차로를 사용하려면 이벤트 큐에 삽입 조건과 삭제 조건이 있어야합니다. 이벤트 포인트는 수직 스위프 라인이 닿는 첫 번째 포인트와 마지막 포인트의 x 좌표입니다. 첫 번째 지점에서 원을 상태에 삽입 하고 가장 가까운 원과의 교차점 (위에서 3 가지 경우를 언급 함)을 확인하고 마지막 지점에서 원을 status 에서 삭제 합니다 .

스위프 라인 알고리즘으로는 충분합니다. 문제가 있거나 다르게해야 할 일이있을 경우 자유롭게 의견을 공유하십시오.

부록 :

수직 스윕 선이 처음 원에 닿으면 원을 삽입하고 스윕 선이 마지막으로 원에 닿을 때 상태에서 원을 제거합니다. 가장 가까운 이전 원에 대해 교차점을 확인해야합니다. 우리는에 원을 추가 한 경우 상태를 우리가 이전에 추가 된 또 다른 원은 이미 있었고 따라서 통과시키는 원이 너무 교차로가있을 수 있습니다, "폐쇄"하지 않았다, 아직 거기에 있었다.


4
전지전능 [인용 필요]
JeffE

@com "가장 가까운 서클"이란 무엇입니까?
Joe

1
status현재 스윕 라인을 교차하는 원 을 유지 한다고 가정 합니까? 현재에 100 개의 원이 status있고 삽입 이벤트를 처리하고 101 번째 원을 삽입 한다고 가정합니다 . 교차점을 확인하기 위해 몇 개의 원을 비교합니까? 비교할 서클을 어떻게 선택합니까?
Joe

@Joe, 이것은 고전적인 스윕 라인 알고리즘에서와 같이 정확히 필요한 것입니다. "두 라인의 교차점은 어떤 시점 에서이 두 라인의 인접성을 의미합니다."나는 원과 비슷한 아날로그를 찾아야합니다. 내가 함께 간단한 일이다 가장 낮은 좌표와 y는 가장 낮은에서 간격의 자신의 투사 교차 원의 경우 가장 높은, 원의 좌표 Y 가장 높은로는 y는 로 교차한다. 아마 지금은 반원에 대한 당신의 생각에 가까워지고 있습니다. 위의 반원은 가장 높은 y 를 포함하고 아래는 가장 낮은 y를 포함합니다 . 와이와이와이와이와이와이
com

답변:


5

당신은 확실히 올바른 길을 가고 있습니다. 가장 큰 문제는 원을 삽입 할 때 교차점을 확인하는 다른 원은 무엇입니까? 이 점검을 어떻게 수행합니까?

선분 교차점의 경우, 주어진 x 좌표에서의 선분이 완전히 정렬됩니다. 가장 낮은 Y 좌표에서 가장 높은 Y 좌표까지 나열 할 수 있습니다. 따라서 이진 검색 트리에서 선 세그먼트를 유지 관리 할 수 ​​있으며 새 세그먼트를 추가 할 때 이진 검색 트리에서 해당 세그먼트의 위치를 ​​찾아 인접 항목의 교차 이벤트를 확인하면됩니다.

서클의 경우 확인할 서클을 즉시 지우지 않습니다. 대답이 "모두"이면 알고리즘에 약간의 작업이 필요합니다.

선 세그먼트와 같이 원이 완전히 정렬되도록 원을 나타내는 방법을 알아낼 수 있습니까?

원을 두 개의 반원으로 표현하십시오. 각 인서트 이벤트는 실제로 두 개의 이벤트입니다.


불행히도 나는 반원에 대한 아이디어를 얻지 못합니다. 반원을 교차 할 수있는 최소 원 단위로 생각할 수 있습니다 (3 가지 교차점 : 교차가 위 반원, 아래 또는 둘 다에 있습니다). 구걸에서 모든 원은 왼쪽과 오른쪽 경계의 x 좌표로 정렬됩니다. 따라서 모든 원은 이미 x 좌표 순서로 제공되므로 x 좌표 상태를 고려하지 않아야합니다 . 따라서 (반원의) 중심의 y 좌표 또는 y와 반지름의 조합을 고려하는 것이 더 논리적으로 보입니다. 당신의 의견?
com

@com 교차점 확인에서와 같이 두 개의 원이 교차하는지 여부를 결정하려면 중심점과 반경이 필요합니다. y 좌표와 반지름만으로 원의 경계를 완전히 지정하지는 않습니다. 당신이 이해하지 못하는 스위프 라인 알고리즘에는 근본적인 것이 있지만, 그것이 무엇인지 말하기는 어렵습니다.
Joe

0

O ((n + k) logn) 시간에 실행되는 Bentley Ottmann 스위프와 유사한이 방법을 생각할 수 있습니다.

선 교차점에서 선분 교차점으로의 문제를 줄일 수 있습니다. 각 원의 수직 지름을 Y 축에 평행하게 고려하겠습니다. 알고리즘은 평면을 아래에서 위로 쓸어주는 수평선을 사용해야합니다.

이제 각 원에 대한 상단 지점, 하단 지점이 있습니다. 또한 스윕 라인이 한 지점에서 두 원을 모두 절단하는 경우에만 두 세그먼트가 교차하도록 교차 술어를 수정해야합니다.

O ((n + k) logn) 시간에 선 교차점 문제를 해결할 수 있으므로 원 교차점에도 동일한 경계가 따릅니다.

나는 이것이 효과가 있다고 확신하지만 당신이 이것이 일반적으로 다루지 않을 경우를 지적 할 수 있다면 알려주십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.