diff --git a/Visibility_2/include/CGAL/Rotational_sweep_visibility_2.h b/Visibility_2/include/CGAL/Rotational_sweep_visibility_2.h index 598a254cdfd..d06c5c8cfae 100644 --- a/Visibility_2/include/CGAL/Rotational_sweep_visibility_2.h +++ b/Visibility_2/include/CGAL/Rotational_sweep_visibility_2.h @@ -311,6 +311,12 @@ private: vs[i+l+right.size()] = left[left.size()-1-l]; } + void print_edx() { + for (int i=0; iouter_ccb(); @@ -367,6 +379,7 @@ private: } + //angular sweep begins for (int i=0; i!=vs.size(); i++) { dp = vs[i]; @@ -445,7 +458,7 @@ private: int i = heap.size()-1; edx[e] = i; int parent = (i-1)/2; - while (i!=0 && is_closer(q, heap[i].first, heap[i].second, heap[parent].first, heap[parent].second)){ + while (i!=0 && is_closer(q, heap[i], heap[parent])){ heap_swap(i, parent); i = parent; parent = (i-1)/2; @@ -470,7 +483,7 @@ private: int i_before_swap = i; int parent = (i-1)/2; - while (i!=0 && is_closer(q, heap[i].first, heap[i].second, heap[parent].first, heap[parent].second)){ + while (i!=0 && is_closer(q, heap[i], heap[parent])){ heap_swap(i, parent); i = parent; parent = (i-1)/2; @@ -481,18 +494,10 @@ private: int left_son = i*2+1; int right_son = i*2+2; int closest_idx = i; - if (left_son < heap.size() && is_closer(q, - heap[left_son].first, - heap[left_son].second, - heap[i].first, - heap[i].second)) { + if (left_son < heap.size() && is_closer(q, heap[left_son], heap[i])) { closest_idx = left_son; } - if (right_son < heap.size() && is_closer(q, - heap[right_son].first, - heap[right_son].second, - heap[closest_idx].first, - heap[closest_idx].second)) { + if (right_son < heap.size() && is_closer(q, heap[right_son], heap[closest_idx])) { closest_idx = right_son; } swapped = false; @@ -526,13 +531,75 @@ private: std::cout< { + const Point_2& q; + const Geometry_traits_2* geom_traits; + public: + Is_closer(const Point_2& q, const Geometry_traits_2* traits): q(q) { + geom_traits = traits; + } + bool operator() (const Pair& e1, const Pair& e2) const { + const Point_2& s1=e1.first, t1=e1.second, s2=e2.first, t2=e2.second; + Orientation e1q = Visibility_2::orientation_2(geom_traits, s1, t1, q); + switch (e1q) + { + case COLLINEAR: + if (Visibility_2::collinear(geom_traits, q, s2, t2)) { + //q is collinear with e1 and e2. + return (Visibility_2::less_distance_to_point_2(geom_traits, q, s1, s2) + || Visibility_2::less_distance_to_point_2(geom_traits, q, t1, t2)); + } + else { + //q is not collinear with e2. q is collinear with e1. + if (Visibility_2::collinear(geom_traits, s2, t2, s1)) + return (Visibility_2::orientation_2(geom_traits, s2, t2, q) + == Visibility_2::orientation_2(geom_traits, s2, t2, t1)); + else + return (Visibility_2::orientation_2(geom_traits, s2, t2, q) + == Visibility_2::orientation_2(geom_traits, s2, t2, s1)); + } + case RIGHT_TURN: + switch (Visibility_2::orientation_2(geom_traits, s1, t1, s2)) { + case COLLINEAR: + return Visibility_2::orientation_2(geom_traits, s1, t1, t2)!=e1q; + case RIGHT_TURN: + if (Visibility_2::orientation_2(geom_traits, s1, t1, t2) == LEFT_TURN) + return Visibility_2::orientation_2(geom_traits, s2, t2, q) + == Visibility_2::orientation_2(geom_traits, s2, t2, s1); + else + return false; + case LEFT_TURN: + if (Visibility_2::orientation_2(geom_traits, s1, t1, t2) == RIGHT_TURN) + return Visibility_2::orientation_2(geom_traits, s2, t2, q) + == Visibility_2::orientation_2(geom_traits, s2, t2, s1); + else + return true; + } + case LEFT_TURN: + switch (Visibility_2::orientation_2(geom_traits, s1, t1, s2)) { + case COLLINEAR: + return Visibility_2::orientation_2(geom_traits, s1, t1, t2)!=e1q; + case LEFT_TURN: + if (Visibility_2::orientation_2(geom_traits, s1, t1, t2) == RIGHT_TURN) + return Visibility_2::orientation_2(geom_traits, s2, t2, q) + == Visibility_2::orientation_2(geom_traits, s2, t2, s1); + else + return false; + case RIGHT_TURN: + if (Visibility_2::orientation_2(geom_traits, s1, t1, t2) == LEFT_TURN) + return Visibility_2::orientation_2(geom_traits, s2, t2, q) + == Visibility_2::orientation_2(geom_traits, s2, t2, s1); + else + return true; + } + } + } + }; bool is_closer(const Point_2& q, - const Point_2& s1, - const Point_2& t1, - const Point_2& s2, - const Point_2& t2) { + const Pair& e1, + const Pair& e2) { + const Point_2& s1=e1.first, t1=e1.second, s2=e2.first, t2=e2.second; Orientation e1q = Visibility_2::orientation_2(geom_traits, s1, t1, q); switch (e1q) { @@ -710,7 +777,8 @@ private: polygon.push_back(p); else { - if (polygon.back() != p){ +// if (polygon.back() != p){ + if (Visibility_2::compare_xy_2(geom_traits, polygon.back(), p) != EQUAL) { polygon.push_back(p); } } @@ -754,6 +822,8 @@ private: }; + + bool is_sweeped_first(const Point_2& p1, const Point_2& p2) { int qua1 = quadrant(q, p1);