diff --git a/Visibility_2/include/CGAL/Simple_polygon_visibility_2.h b/Visibility_2/include/CGAL/Simple_polygon_visibility_2.h index c15daee0261..df58d8902ce 100644 --- a/Visibility_2/include/CGAL/Simple_polygon_visibility_2.h +++ b/Visibility_2/include/CGAL/Simple_polygon_visibility_2.h @@ -265,17 +265,47 @@ private: } - // Quick fix for now. Can be done faster. - std::vector segments; - for(typename std::vector::size_type i = 0; - i < points.size() - 1; ++i) - { - segments.push_back(Segment_2(points[i], points[i+1])); + // Quick fix for now. Can be done faster + bool is_degenerate = false; + for(int i = 0; i < points.size()-2;i++){ + if(CGAL::orientation(points[i],points[i+1],points[i+2]) == CGAL::COLLINEAR){ + is_degenerate = true; + break; + } + } + if(is_degenerate){ + //std::cout << is_degenerate << std::endl; + std::vector segments; + + for(typename std::vector::size_type i = 0;i < points.size() - 1; ++i) + { + segments.push_back(Segment_2(points[i], points[i+1])); + } + CGAL::insert(out_arr, segments.begin(), segments.end()); + }else{ + points.pop_back(); + //std::cout << " ordanary " << std::endl; + typename VARR::Vertex_handle v_last, v_first; + v_last = v_first = + out_arr.insert_in_face_interior(points[0],out_arr.unbounded_face()); + + for(unsigned int i = 0; i < points.size()-1; i++){ + if(points[i] < points[(i+1)]){ + v_last = out_arr.insert_from_left_vertex ( + Segment_2(points[i], points[i+1]), v_last + )->target(); + } else { + v_last = out_arr.insert_from_right_vertex( + Segment_2(points[i], points[i+1]), v_last + )->target(); + } + } + out_arr.insert_at_vertices( + Segment_2(points.front(), points.back()), + v_last, v_first + ); } - - CGAL::insert(out_arr, segments.begin(), segments.end()); - // Visibility_2::report_while_handling_needles( // traits, q, points, out_arr);