added O(n) copy into arr in case of general position

This commit is contained in:
Michael Hemmer 2015-06-15 20:30:54 +02:00
parent 30fb891d11
commit 3b78e76ec1
1 changed files with 39 additions and 9 deletions

View File

@ -265,17 +265,47 @@ private:
}
// Quick fix for now. Can be done faster.
std::vector<Segment_2> segments;
for(typename std::vector<Point_2>::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<Segment_2> segments;
for(typename std::vector<Point_2>::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<Simple_polygon_visibility_2>(
// traits, q, points, out_arr);