no insertion of same edge twice

This commit is contained in:
kanhuang 2013-07-17 23:12:26 -04:00
parent 2b863b7fda
commit cde5ec15be
2 changed files with 16 additions and 12 deletions

View File

@ -256,6 +256,7 @@ public:
Intersection_type i_type = needle(active_edges, curr_vision_ray, collinear_vertices); Intersection_type i_type = needle(active_edges, curr_vision_ray, collinear_vertices);
switch (i_type) { switch (i_type) {
case UNBOUNDED : case UNBOUNDED :
//todo:this part is not finished.
//remove right and collinear; //remove right and collinear;
remove_edges(active_edges, curr_vision_ray); remove_edges(active_edges, curr_vision_ray);
update_visibility(right_p, polygon, out_arr); update_visibility(right_p, polygon, out_arr);
@ -271,10 +272,10 @@ public:
remove_edges(active_edges, curr_vision_ray); remove_edges(active_edges, curr_vision_ray);
left_p = intersection_point(curr_vision_ray, active_edges[0]); left_p = intersection_point(curr_vision_ray, active_edges[0]);
update_visibility(right_p, polygon, out_arr); update_visibility(right_p, polygon, out_arr);
insert_needle(collinear_vertices, polygon, out_arr);
update_visibility(collinear_vertices, polygon, out_arr);
// update_visibility(mid_p, polygon, out_arr); // update_visibility(mid_p, polygon, out_arr);
update_visibility(left_p, polygon, out_arr); // update_visibility(left_p, polygon, out_arr);
polygon.push_back(left_p);
break; break;
case INNER : case INNER :
//remove right and collinear; //remove right and collinear;
@ -285,8 +286,9 @@ public:
else { else {
left_p = intersection_point(curr_vision_ray, active_edges[0]); left_p = intersection_point(curr_vision_ray, active_edges[0]);
update_visibility(right_p, polygon, out_arr); update_visibility(right_p, polygon, out_arr);
update_visibility(collinear_vertices, polygon, out_arr); insert_needle(collinear_vertices, polygon, out_arr);
update_visibility(left_p, polygon, out_arr); // update_visibility(left_p, polygon, out_arr);
polygon.push_back(left_p);
} }
break; break;
} }
@ -294,7 +296,7 @@ public:
vit = end_it; vit = end_it;
} }
if (!is_init_empty) { if (!is_init_empty) {
CGAL::insert(out_arr, Segment_2(polygon.front(),polygon.back())); CGAL::insert(out_arr, Segment_2(polygon.back(),polygon.front()));
} }
} }
@ -496,9 +498,11 @@ private:
} }
} }
void update_visibility(const std::vector<Point_2>& points, std::vector<Point_2>& polygon, Arrangement_2 &arr){ void insert_needle(const std::vector<Point_2>& points, std::vector<Point_2>& polygon, Arrangement_2 &arr){
for (int i = 0; i != points.size(); i++) { if (points.size() > 1) {
update_visibility(points[i], polygon, arr); for (int i = 0; i != points.size()-1; i++) {
CGAL::insert(arr, Segment_2(points[i], points[i+1]));
}
} }
} }

View File

@ -27,7 +27,7 @@ std::string number2string(T n) {
} }
int main() { int main() {
int case_number = 5; int case_number = 1;
//test kernel Cartesian<Gmpq> //test kernel Cartesian<Gmpq>
{ {
typedef CGAL::Gmpq Number_type; typedef CGAL::Gmpq Number_type;
@ -59,8 +59,8 @@ int main() {
if (!fit->is_unbounded()) break; if (!fit->is_unbounded()) break;
} while (++fit != arr_in.faces_end()); } while (++fit != arr_in.faces_end());
vb.visibility_region(Point_2(0, 0), fit, arr_vb); vb.visibility_region(Point_2(0, 0), fit, arr_vb);
// CGAL::Visibility_2::print_arrangement(arr_vb); CGAL::Visibility_2::print_arrangement(arr_vb);
// CGAL::Visibility_2::print_arrangement(arr_ans); CGAL::Visibility_2::print_arrangement(arr_ans);
std::cout<<(true == (CGAL::test_are_equal<Arrangement_2>(arr_ans, arr_vb)))<<std::endl; std::cout<<(true == (CGAL::test_are_equal<Arrangement_2>(arr_ans, arr_vb)))<<std::endl;
std::cout<<CGAL::compare_arr_by_edges(arr_ans, arr_vb)<<std::endl; std::cout<<CGAL::compare_arr_by_edges(arr_ans, arr_vb)<<std::endl;
} }