diff --git a/Visibility_2/include/CGAL/Naive_visibility_2.h b/Visibility_2/include/CGAL/Naive_visibility_2.h index 2fdeb51aa6a..0ea916106e0 100644 --- a/Visibility_2/include/CGAL/Naive_visibility_2.h +++ b/Visibility_2/include/CGAL/Naive_visibility_2.h @@ -770,8 +770,8 @@ private: typename Output_arrangement_2::Edge_iterator e_itr; for (e_itr = out_arr.edges_begin() ; e_itr != out_arr.edges_end() ; e_itr++) { - Halfedge_const_handle he = e_itr; - Halfedge_const_handle he_twin = he->twin(); + Halfedge_handle he = e_itr; + Halfedge_handle he_twin = he->twin(); if (he->face() == he_twin->face()) { out_arr.remove_edge(he); } diff --git a/Visibility_2/include/CGAL/Triangular_expansion_visibility_2_.h b/Visibility_2/include/CGAL/Triangular_expansion_visibility_2_.h index fc7650f5758..61a94a30fd8 100644 --- a/Visibility_2/include/CGAL/Triangular_expansion_visibility_2_.h +++ b/Visibility_2/include/CGAL/Triangular_expansion_visibility_2_.h @@ -353,7 +353,7 @@ public: if(location == CDT::VERTEX){ std::cout << "query on vertex" << std::endl; - bool query_point_on_vertex_is_not_yet_implemented = false; + bool query_point_on_vertex_is_not_working_yet = false; assert(query_point_on_vertex_is_not_working_yet); assert(q == he->target()->point()); diff --git a/Visibility_2/test/Visibility_2/benchmark.cpp b/Visibility_2/test/Visibility_2/benchmark.cpp index b9cbbdfce5b..c9a29d45065 100644 --- a/Visibility_2/test/Visibility_2/benchmark.cpp +++ b/Visibility_2/test/Visibility_2/benchmark.cpp @@ -48,21 +48,83 @@ int main(int argc, char* argv[]) { Naive_visibility_2; typedef CGAL::Triangular_expansion_visibility_2 Triangular_expansion_visibility_2; - - if (argc == 2) { - Simple_polygon_visibility_2 simple_visibility; - Naive_visibility_2 naive_visibility; - Triangular_expansion_visibility_2 triangular_visibility; - const CGAL::Query_choice qchoice = CGAL::FACE; + + Simple_polygon_visibility_2 simple_visibility; + Naive_visibility_2 naive_visibility; + Triangular_expansion_visibility_2 triangular_visibility; + CGAL::Query_choice qchoice = CGAL::FACE; + if (argc > 1) { std::string input_arr_file(argv[1]); std::ifstream input(input_arr_file.c_str()); - // CGAL::benchmark - // (naive_visibility, triangular_visibility, qchoice, input); - CGAL::benchmark - (simple_visibility, triangular_visibility, qchoice, input); + if (argc == 2) { + CGAL::benchmark + (simple_visibility, triangular_visibility, qchoice, input); + return 0; + } + + if (argc == 3) { + qchoice = CGAL::FACE; + std::string class_name(argv[2]); + if ( class_name == "SN") { + CGAL::benchmark + (simple_visibility, naive_visibility, qchoice, input); + return 0; + } + if (class_name == "ST") { + CGAL::benchmark + (simple_visibility, triangular_visibility, qchoice, input); + return 0; + } + if (class_name == "NT") { + CGAL::benchmark + (naive_visibility, triangular_visibility, qchoice, input); + return 0; + } + std::cout<<"no type is matched.\n"; + return 0; + } + + if (argc == 4) { + std::string query_type(argv[3]); + if (query_type == "vertex") + qchoice = CGAL::VERTEX; + else { + if (query_type == "edge") + qchoice = CGAL::EDGE; + else { + if (query_type == "face") + qchoice = CGAL::FACE; + else { + std::cout<<"query type is not matched.\n"; + return 0; + } + } + } + std::string class_name(argv[2]); + if ( class_name == "SN") { + CGAL::benchmark + (simple_visibility, naive_visibility, qchoice, input); + return 0; + } + if (class_name == "ST") { + CGAL::benchmark + (simple_visibility, triangular_visibility, qchoice, input); + return 0; + } + if (class_name == "NT") { + CGAL::benchmark + (naive_visibility, triangular_visibility, qchoice, input); + return 0; + } + std::cout<<"no type is matched.\n"; + return 0; + } } else { - std::cout << "Usage: ./benchmark [filename]\n"; + std::cout << "Usage: ./benchmark [filename] [Class types] [Query type]\n"; + std::cout << "where [Class type] could be SN(simple and naive), ST(simple and triangular) and NT(naive and triangular), indicating which classes you want to test.\n"; + std::cout << "[Query type] could be vertex, edge, face.\n"; + std::cout << "The default value of [Class type] is ST. The default value of [Query type] is face.\n"; exit(0); } } diff --git a/Visibility_2/test/Visibility_2/include/CGAL/test_utils.h b/Visibility_2/test/Visibility_2/include/CGAL/test_utils.h index dd25761b93e..f7b15ddd059 100644 --- a/Visibility_2/test/Visibility_2/include/CGAL/test_utils.h +++ b/Visibility_2/test/Visibility_2/include/CGAL/test_utils.h @@ -687,7 +687,7 @@ void benchmark_one_unit( << GREEN << timer.time() << " sec" << RESET << std::endl; assert(true == (CGAL::test_are_equal - (out_arr_fst, out_arr_snd))); + (out_arr_fst, out_arr_snd))); } while (++curr != circ); } @@ -804,10 +804,10 @@ int intersect_seg(const Segment_2& seg1, const Segment_2& seg2, Segment_2& seg_o return 0; } } - +//make sure q is in fh or on the bound. template bool is_star_shape(const typename Visibility_2::Point_2& q, - const typename Visibility_2::Face_const_handle fh) { + const typename Visibility_2::Face_handle fh) { typedef typename Visibility_2::Output_arrangement_2 Output_arrangement_2; typedef typename Output_arrangement_2::Face_const_handle Face_const_handle; @@ -831,8 +831,7 @@ bool is_star_shape(const typename Visibility_2::Point_2& q, Point_2 source = curr1->source()->point(); Point_2 target = curr1->target()->point(); int i = intersect_seg(Segment_2(p, q), Segment_2(source, target), intersect_s, intersect_p); - if (i == 1 && intersect_p != source && intersect_p != target) - + if (i == 1 && intersect_p != source && intersect_p != target && intersect_p != q) return false; } while (++curr1 != circ1); } while (++curr != circ); @@ -854,8 +853,11 @@ void test_star_shape_one_face( const typename Visibility_2::Input_arrangement_2 typedef typename Input_arrangement_2::Geometry_traits_2 Geometry_traits_2; typedef typename Input_arrangement_2::Face_const_handle Face_const_handle; + typedef typename Input_arrangement_2::Ccb_halfedge_const_circulator Ccb_halfedge_const_circulator; + + typedef typename Output_arrangement_2::Face_handle Face_handle; typedef typename Geometry_traits_2::Point_2 Point_2; typedef typename Geometry_traits_2::FT Number_type; typedef Timer Benchmark_timer; @@ -899,14 +901,14 @@ void test_star_shape_one_face( const typename Visibility_2::Input_arrangement_2 std::cout << " Running with qpoint: " << RED << curr_query_pt << RESET << std::endl; Output_arrangement_2 out_arr; - Face_const_handle fh; + Face_handle fh; if (choice == FACE) { fh = visibility.visibility_region(curr_query_pt, fit, out_arr); } else { fh = visibility.visibility_region(curr_query_pt, he, out_arr); } - if ( !is_star_shape(curr_query_pt, fh)) { + if ( !is_star_shape(curr_query_pt, fh)) { std::cout << RED << " The face is not a star shape to qpoint." << RESET << std::endl; } } while (++curr != circ); @@ -959,7 +961,7 @@ void test_star_shape(Visibility_2 &visibility, int cnt(1); for (fit = arr.faces_begin() ; fit != arr.faces_end() ; fit++) { if (!fit->is_unbounded()) { - std::cout << "Benchmarking with face " + std::cout << "Test star-shape with face " << GREEN << cnt << RESET << " ..." << std::endl; Hole_const_iterator hit; bool has_holes = false; diff --git a/Visibility_2/test/Visibility_2/test_star_shape.cpp b/Visibility_2/test/Visibility_2/test_star_shape.cpp index 85423d0df58..0a59a300156 100644 --- a/Visibility_2/test/Visibility_2/test_star_shape.cpp +++ b/Visibility_2/test/Visibility_2/test_star_shape.cpp @@ -32,6 +32,7 @@ #include #include + #include #include @@ -52,20 +53,90 @@ int main(int argc, char* argv[]) { if (argc == 2) { Simple_polygon_visibility_2 simple_visibility; - Naive_visibility_2 naive_visibility; - Triangular_expansion_visibility_2 triangular_visibility; const CGAL::Query_choice qchoice = CGAL::FACE; std::string input_arr_file(argv[1]); std::ifstream input(input_arr_file.c_str()); - CGAL::test_star_shape - (naive_visibility, qchoice, input); - // CGAL::benchmark - // (simple_visibility, triangular_visibility, qchoice, input); + CGAL::test_star_shape + (simple_visibility, qchoice, input); + return 0; } - else { - std::cout << "Usage: ./benchmark [filename]\n"; - exit(0); + + if (argc == 3) { + const CGAL::Query_choice qchoice = CGAL::FACE; + std::string input_arr_file(argv[1]); + std::ifstream input(input_arr_file.c_str()); + std::string class_name(argv[2]); + if ( class_name == "simple") { + Simple_polygon_visibility_2 simple_visibility; + CGAL::test_star_shape + (simple_visibility, qchoice, input); + return 0; + } + if (class_name == "naive") { + Naive_visibility_2 naive_visibility; + CGAL::test_star_shape + (naive_visibility, qchoice, input); + return 0; + } + if (class_name == "triangular") { + Triangular_expansion_visibility_2 triangular_visibility; + CGAL::test_star_shape + (triangular_visibility, qchoice, input); + return 0; + } + std::cout<<"no type is matched.\n"; + return 0; } + + if (argc == 4) { + std::string input_arr_file(argv[1]); + std::ifstream input(input_arr_file.c_str()); + CGAL::Query_choice qchoice; + std::string query_type(argv[3]); + if (query_type == "vertex") + qchoice = CGAL::VERTEX; + else { + if (query_type == "edge") + qchoice = CGAL::EDGE; + else { + if (query_type == "face") + qchoice = CGAL::FACE; + else { + std::cout<<"query type is not matched.\n"; + return 0; + } + } + } + std::string class_name(argv[2]); + if (class_name == "simple") { + Simple_polygon_visibility_2 simple_visibility; + CGAL::test_star_shape + (simple_visibility, qchoice, input); + return 0; + } + if (class_name == "naive") { + Naive_visibility_2 naive_visibility; + CGAL::test_star_shape + (naive_visibility, qchoice, input); + return 0; + } + if (class_name == "triangular") { + Triangular_expansion_visibility_2 triangular_visibility; + CGAL::test_star_shape + (triangular_visibility, qchoice, input); + return 0; + } + std::cout<<"no type is matched.\n"; + return 0; + + } + + + std::cout << "Usage: ./test_star_shape [filename] [Class type] [Query type]\n"; + std::cout << "where [Class type] could be simple, naive and triangular, indicating which class you want to test.\n"; + std::cout << "[Query type] could be vertex, edge, face.\n"; + std::cout << "The default value of [Query type] is face. The default value of [Class type] is simple.\n"; + exit(0); } - return 0; + }