이 책에 기반한 세그먼트 교차점에 대한 평면 스윕 알고리즘을 C++ 코드로 구현하려고합니다 : http://www.cs.uu.nl/geobook/. 이들은 균형 이진 검색 트리를 사용하여 평면 스윕의 상태 구조를 구현할 것을 제안합니다.평면 스위프 알고리즘 : 교차점 이후에 세그먼트를 정렬하는 방법
상태 구조를 구현하기 위해 std :: set 구조를 사용하고 있지만 지점 "p"가 포함 된 세그먼트를 재정렬하는 데 문제가 있으며 상위 끝점은 "p"지점입니다. 그들은 동일한 좌표 점을 가지고 있습니다. 즉, 반복적 인 값을 허용하지 않기 때문에 std :: set에 삽입 할 수 없습니다 ... 더 낮은 끝점과 함께 삽입하려고했으나 그 다음에 순서를 잃을 것입니다. 그들은 "p"바로 밑의 스윕 라인과 교차합니다. 책에
의사 코드는 다음 말한다 :
U (P) 타오에 ∪C (P)의
- 삽입 세그먼트. Tao의 세그먼트 순서는 에 의해 p 아래에 스윕 라인이 교차되는 순서와 일치해야합니다. 수평 세그먼트가있는 경우 p가 포함 된 모든 세그먼트 중에서 마지막으로 이됩니다.
- 는 (* 삭제 및 C (P)의 세그먼트를 재 삽입하는 순서를 반전시킵니다. *)
나는 세그먼트를 삽입으로 나는 그들이 .. 자신의 순서를 반대로가는 방법을 모르는 상태 구조에서 x 위 종점 좌표로 정렬합니다. 나는 교차로 후에 그들의 순서를 교환하는 방법을 모른다.
아이디어가 있으십니까?
업데이트 :이 책은 https://books.google.com/books?id=C8zaAWuOIOcC에 있지만 일부 페이지는 나타나지 않습니다. 이 페이지는 24, 25, 26 희망은 어떤 상황
보다도,
이것은 좋은 접근 방법이 아닙니다. std :: set에는 시간이 지남에 따라 출력을 변경하지 않는 비교기가 필요하며이를 위반하면 버그가 발생합니다. 'std :: set'가 균형 잡힌 이진 트리를 사용하여 구현되었다고해서 그것이 원시적 인 이진 트리로 사용될 수 있다는 것을 의미하지는 않습니다. Sweepline 알고리즘이 그것을 사용하는 방식은 순서 함수가 아닌 수동 스왑을 필요로하며,'std :: set'가 설정되지 않습니다. – Sneftel
@Sneftel 나는'std : set'이 자동적으로 상태에있는 정확한 세그먼트 순서를 유지할 것을 결코 의미하지 않았다. 교차 이벤트를 처리하는 동안 여전히 세그먼트를 교환해야합니다. – Leon
올바른 순서를 유지하는 것이 아닙니다. 'std :: set'은 비교 함수가 바뀔 것으로 기대하지 않습니다. 그렇다면 프로그램이 중단 될 수 있습니다. – Sneftel