fix a bug Naive_visibility_2.h

This commit is contained in:
kanhuang 2013-07-16 19:23:31 -04:00
parent 538e5ca1ee
commit 6f916cd4d1
3 changed files with 69 additions and 36 deletions

View File

@ -23,10 +23,10 @@ void print(std::vector<Point_handle> ps){
std::cout<<ps[i]->point().x()<<","<<ps[i]->point().y()<<std::endl;
}
}
template <typename Point_2>
void print_point(const Point_2& p) {
std::cout<<"["<<p.x()<<","<<p.y()<<"]"<<std::endl;
}
//template <typename Point_2>
//void print_point(const Point_2& p) {
// std::cout<<"["<<p.x()<<","<<p.y()<<"]"<<std::endl;
//}
template <typename Arrangement_2, typename Regularization_tag>
@ -179,7 +179,6 @@ public:
std::vector<Halfedge_const_handle> edges, active_edges; //edges stores all halfedges of the face; and active_edges stores all halfedges that is currently intersected by the view ray.
//preprocess the face
input_face(fh, vertices, edges, query);
print(vertices);
//initiation of vision ray
Vector_2 dir;
if (Direction_2(-1, 0) < Direction_2(Vector_2(query, (*vertices.rbegin())->point())))
@ -530,9 +529,6 @@ private:
add_edge(*begin_it, edges, r);
} while (++begin_it != end_it);
//debug
std::cout<<"after adding"<<std::endl;
print_edges(edges);
}
//remove edges that are not active any longer
@ -573,23 +569,25 @@ private:
Intersection_type needle(std::vector<Halfedge_const_handle>& edges, Ray_2& r, std::vector<Point_2>& collinear_vertices) {
typename std::vector<Halfedge_const_handle>::iterator curr = edges.begin();
// Point_2 p = r.source(), end1, end2;
Vertex_const_handle vertex1, vertex2;
Vertex_const_handle vertex1;
//flag shows whether the left side or right side of needle is blocked.
bool block_left, block_right;
do {
Point_2 cross = intersection_point(r, *curr);
print_point(cross);
if (cross != (*curr)->source()->point() && cross != (*curr)->target()->point()) {
collinear_vertices.push_back(cross);
return INNER;
}
if (cross == (*curr)->source()->point()) {
vertex1 = (*curr)->source();
vertex2 = (*curr)->target();
if (CGAL::orientation(r.source(), (*curr)->source()->point(), (*curr)->target()->point()) == CGAL::COLLINEAR) {
vertex1 = (*curr)->target();
}
else {
vertex1 = (*curr)->target();
vertex2 = (*curr)->source();
if (cross == (*curr)->source()->point()) {
vertex1 = (*curr)->source();
}
else {
vertex1 = (*curr)->target();
}
}
if (collinear_vertices.empty() || vertex1->point() != collinear_vertices.back()) {
collinear_vertices.push_back(vertex1->point());

View File

@ -1,5 +1,5 @@
# Non-regularized visibility result of Test case 4 for arbitrary arrangement. See https://cgal.geometryfactory.com/CGAL/Members/wiki/Visibility/TestCases
12
14
0 2
0 3
-1 3
@ -12,6 +12,8 @@
5 0
7 0
10 0
3 3
1 1
14
0 1
1 2

View File

@ -19,8 +19,15 @@
#include <fstream>
#include <string>
template <typename T>
std::string number2string(T n) {
std::stringstream ss;
ss << n;
return ss.str();
}
int main() {
int case_number = 5;
int case_number = 1;
//test kernel Cartesian<Gmpq>
{
typedef CGAL::Gmpq Number_type;
@ -33,34 +40,60 @@ int main() {
std::cout<<"Kernel: Cartesian<Gmpq>"<<std::endl;
for (int i=1; i <= case_number; i++) {
std::cout<<"Test "<<i<<" begins"<<std::endl;
std::string input_arr_file, ans_file;
std::stringstream ss("data/Arrangement_Test/in");
ss << i;
ss >> input_arr_file;
std::stringstream ss2("data/Arrangement_Test/non_regular_out");
ss2 << i;
ss2 >> ans_file;
std::string input_arr_file("data/Arrangement_Test/in");
input_arr_file += number2string(i);
std::string ans_file("data/Arrangement_Test/non_regular_out");
ans_file += number2string(i);
std::ifstream input(input_arr_file.c_str());
// std::cout<<"read file over\n";
std::ifstream ans_input(ans_file.c_str());
Arrangement_2 arr_in, arr_out, arr_vb;
// std::cout<<"read another file\n";
Arrangement_2 arr_in, arr_ans, arr_vb;
CGAL::create_arrangement_from_file<Arrangement_2>(arr_in, input);
CGAL::create_arrangement_from_file<Arrangement_2>(arr_out, ans_input);
CGAL::create_arrangement_from_file<Arrangement_2>(arr_ans, ans_input);
CGAL::Visibility_2::Naive_visibility_2<Arrangement_2, CGAL::Tag_false> vb(arr_in);
vb.visibility_region(Point_2(0, 0), face, arr_vb);
assert(true == (CGAL::test_are_equal<Arrangement_2>(arr_out, arr_vb)));
typename Arrangement_2::Face_const_handle fit = arr_in.faces_begin();
do {
if (!fit->is_unbounded()) break;
} while (++fit != arr_in.faces_end());
vb.visibility_region(Point_2(0, 0), fit, arr_vb);
// CGAL::Visibility_2::print_arrangement(arr_vb);
// CGAL::Visibility_2::print_arrangement(arr_ans);
std::cout<<(true == (CGAL::test_are_equal<Arrangement_2>(arr_ans, arr_vb)))<<std::endl;
}
}
//test kernel Exact_predicates_exact_constructions_kernel
{
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef CGAL::Arr_segment_traits_2<Kernel> Traits_2;
typedef Traits_2::Point_2 Point_2;
typedef Traits_2::X_monotone_curve_2 Segment_2;
typedef CGAL::Arrangement_2<Traits_2> Arrangement_2;
// {
// typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
// typedef CGAL::Arr_segment_traits_2<Kernel> Traits_2;
// typedef Traits_2::Point_2 Point_2;
// typedef Traits_2::X_monotone_curve_2 Segment_2;
// typedef CGAL::Arrangement_2<Traits_2> Arrangement_2;
std::cout<<"Kernel: Exact_predicates_exact_constructions"<<std::endl;
// std::cout<<"Kernel: Exact_predicates_exact_constructions"<<std::endl;
// for (int i=1; i <= case_number; i++) {
// std::cout<<"Test "<<i<<" begins"<<std::endl;
// std::string input_arr_file("data/Arrangement_Test/in");
// input_arr_file += number2string(i);
// std::string ans_file("data/Arrangement_Test/non_regular_out");
// ans_file += number2string(i);
}
// std::ifstream input(input_arr_file.c_str());
// std::ifstream ans_input(ans_file.c_str());
// Arrangement_2 arr_in, arr_ans, arr_vb;
// CGAL::create_arrangement_from_file<Arrangement_2>(arr_in, input);
// CGAL::create_arrangement_from_file<Arrangement_2>(arr_ans, ans_input);
// CGAL::Visibility_2::Naive_visibility_2<Arrangement_2, CGAL::Tag_false> vb(arr_in);
// typename Arrangement_2::Face_const_handle fit = arr_in.faces_begin();
// do {
// if (!fit->is_unbounded()) break;
// } while (++fit != arr_in.faces_end());
// vb.visibility_region(Point_2(0, 0), fit, arr_vb);
// std::cout<<(true == (CGAL::test_are_equal<Arrangement_2>(arr_ans, arr_vb)))<<std::endl;
// }
// }
return 0;
}