add report_while_handling_needles_(). still not working now

This commit is contained in:
kanhuang 2013-09-08 22:01:22 -04:00
parent 3c1f1193fa
commit 4a863866ae
1 changed files with 186 additions and 0 deletions

View File

@ -362,6 +362,192 @@ void report_while_handling_needles(
}
}
template <class Visibility_2>
void report_while_handling_needles_(
const typename Visibility_2::Input_arrangement_2::Geometry_traits_2 *geom_traits,
const typename Visibility_2::Input_arrangement_2::Point_2& q,
std::vector<typename Visibility_2::Input_arrangement_2::Point_2>& points,
typename Visibility_2::Output_arrangement_2& arr_out) {
typedef typename Visibility_2::Input_arrangement_2 Input_arrangement_2;
typedef typename Input_arrangement_2::Point_2 Point_2;
typedef typename Input_arrangement_2::Geometry_traits_2 Geometry_traits_2;
typedef typename Input_arrangement_2::Halfedge_handle Halfedge_handle;
typedef typename Input_arrangement_2::Vertex_handle Vertex_handle;
typedef typename Geometry_traits_2::Segment_2 Segment_2;
typedef typename Geometry_traits_2::Direction_2 Direction_2;
typename std::vector<Segment_2>::size_type i = 0;
if (points.front() == points.back()) {
points.pop_back();
}
while (collinear(geom_traits,
q,
points[i],
points.back())) {
points.push_back(points[i]);
i++;
}
points.push_back(points[i]);
Halfedge_handle he_handle;
Vertex_handle v_trg;
Vertex_handle v_fst;
Vertex_handle v_needle_end;
v_trg = v_fst = arr_out.insert_in_face_interior(points[i], arr_out.unbounded_face());
std::cout << "\nPOINTS\n";
for(unsigned int k = 0 ; k < points.size() ; k++) {
std::cout << points[k] << std::endl;
}
std::cout << "END\n";
while (i+1 < points.size()) {
if ( collinear(geom_traits,
points[i],
points[i+1],
q)) {
Vertex_handle v_needle_begin = v_trg;
std::vector<Point_2> forward_needle;
std::vector<Point_2> backward_needle;
std::vector<Point_2> closer_to_q_part;
closer_to_q_part.push_back(points[i]);
forward_needle.push_back((points[i]));
bool is_closer_to_q = less_distance_to_point_2(geom_traits,
q,
points[i+1],
points[i]);
if (is_closer_to_q)
closer_to_q_part.push_back(points[i+1]);
else
forward_needle.push_back(points[i+1]);
i++;
while (i+1< points.size() && orientation_2(geom_traits,
points[i],
points[i+1],
q ) == CGAL::COLLINEAR) {
if (is_closer_to_q) {
closer_to_q_part.push_back(points[i+1]);
}
else {
if (less_distance_to_point_2(geom_traits, q, points[i+1], closer_to_q_part.front())) {
is_closer_to_q = true;
closer_to_q_part.push_back(points[i+1]);
}
else {
if (less_distance_to_point_2(geom_traits, q, points[i], points[i+1]))
forward_needle.push_back(points[i+1]);
else
backward_needle.push_back(points[i+1]);
}
}
i++;
}
Point_2 end_of_needle;
if (is_closer_to_q)
end_of_needle = closer_to_q_part.back();
else {
if (backward_needle.empty()) {
end_of_needle = forward_needle.back();
}
else {
end_of_needle = backward_needle.back();
}
}
// std::cout << "end of needle set to " << end_of_needle << std::endl;
std::reverse(backward_needle.begin(), backward_needle.end());
std::vector<Point_2> merged_needle;
// Now merge the two vectors
unsigned int itr_fst = 0, itr_snd = 0;
while (itr_fst < forward_needle.size() &&
itr_snd < backward_needle.size()) {
if (less_distance_to_point_2(geom_traits,
q,
forward_needle[itr_fst],
backward_needle[itr_snd])) {
merged_needle.push_back(forward_needle[itr_fst]);
itr_fst++;
}
else {
merged_needle.push_back(backward_needle[itr_snd]);
itr_snd++;
}
}
while (itr_fst < forward_needle.size()) {
merged_needle.push_back(forward_needle[itr_fst]);
itr_fst++;
}
while (itr_snd < backward_needle.size()) {
merged_needle.push_back(backward_needle[itr_snd]);
itr_snd++;
}
for (unsigned int p = 0 ; p+1 < merged_needle.size() ; p++) {
if (CGAL::Visibility_2::compare_xy_2<Geometry_traits_2>(geom_traits, merged_needle[p], merged_needle[p+1]) == CGAL::SMALLER) {
std::cout << "insertingN seg " << Segment_2(merged_needle[p], merged_needle[p+1]) << " from left of " << v_trg->point() << std::endl;
he_handle = arr_out.insert_from_left_vertex(Segment_2(merged_needle[p], merged_needle[p+1]), v_trg);
}
else {
std::cout << "insertingN seg " << Segment_2(merged_needle[p], merged_needle[p+1]) << " from right of " << v_trg->point() << std::endl;
he_handle = arr_out.insert_from_right_vertex(Segment_2(merged_needle[p], merged_needle[p+1]), v_trg);
}
v_trg = he_handle->target();
if (merged_needle[p+1] == end_of_needle) {
v_needle_end = v_trg;
std::cout << "set needle end to " << v_needle_end->point();
}
}
if (is_closer_to_q) {
v_trg = v_needle_begin;
for (unsigned int p = 0 ; p+1 < closer_to_q_part.size() ; p++) {
if (CGAL::Visibility_2::compare_xy_2<Geometry_traits_2>(geom_traits, merged_needle[p], merged_needle[p+1]) == CGAL::SMALLER) {
std::cout << "insertingN seg " << Segment_2(merged_needle[p], merged_needle[p+1]) << " from left of " << v_trg->point() << std::endl;
he_handle = arr_out.insert_from_left_vertex(Segment_2(merged_needle[p], merged_needle[p+1]), v_trg);
}
else {
std::cout << "insertingN seg " << Segment_2(merged_needle[p], merged_needle[p+1]) << " from right of " << v_trg->point() << std::endl;
he_handle = arr_out.insert_from_right_vertex(Segment_2(merged_needle[p], merged_needle[p+1]), v_trg);
}
v_trg = he_handle->target();
}
}
else
v_trg = v_needle_end;
}
else {
if (CGAL::Visibility_2::compare_xy_2<Geometry_traits_2>(geom_traits, v_trg->point(), points[i+1]) == CGAL::SMALLER) {
std::cout << "inserting seg " << Segment_2(points[i], points[i+1]) << " from left of " << v_trg->point() << std::endl;
he_handle = arr_out.insert_from_left_vertex(Segment_2(points[i], points[i+1]), v_trg);
}
else {
std::cout << "inserting seg " << Segment_2(points[i], points[i+1]) << " from right of " << v_trg->point() << std::endl;
he_handle = arr_out.insert_from_right_vertex(Segment_2(points[i], points[i+1]), v_trg);
}
v_trg = he_handle->target();
}
i++;
std::cout<<"next insertion: "<<v_trg->point()<<std::endl;
if (i+2 == points.size()) {
v_trg = he_handle->target();
std::cout<<v_fst->point()<<std::endl;
std::cout<<v_trg->point()<<std::endl;
arr_out.insert_at_vertices(Segment_2(points[points.size()-2], points[points.size()-1]), v_trg, v_fst);
break;
}
}
}
} // end namespace Visibility_2