mirror of https://github.com/CGAL/cgal
fixed last major bug
This commit is contained in:
parent
e453aa9495
commit
99b86148d6
|
|
@ -158,13 +158,7 @@ public:
|
|||
else {
|
||||
vertices.push_back(vertices[0]);
|
||||
}
|
||||
/*
|
||||
std::cout << "VERTICES\n";
|
||||
for(unsigned int i = 0 ; i < vertices.size() ; i++) {
|
||||
std::cout << vertices[i] << std::endl;
|
||||
}
|
||||
std::cout << "END VERTICES\n";
|
||||
*/
|
||||
|
||||
visibility_region_impl(q);
|
||||
|
||||
typename std::vector<Point_2> points;
|
||||
|
|
@ -198,13 +192,7 @@ public:
|
|||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
std::cout << "POINTS\n";
|
||||
for (unsigned int i = 0 ; i < points.size() ; i++) {
|
||||
std::cout << points[i]<<std::endl;
|
||||
}
|
||||
std::cout << "END POINTS\n";
|
||||
*/
|
||||
|
||||
std::reverse(points.begin(), points.end());
|
||||
|
||||
CGAL::Visibility_2::report_while_handling_needles
|
||||
|
|
@ -228,7 +216,6 @@ public:
|
|||
Face_handle compute_visibility(const Point_2& q, const Halfedge_const_handle he,
|
||||
Output_arrangement_2& out_arr ) {
|
||||
|
||||
std::cout << "query on he = " << he->source()->point() << " " << he->target()->point() << std::endl;
|
||||
query_pt_is_vertex = false;
|
||||
query_pt_is_on_halfedge = false;
|
||||
|
||||
|
|
@ -265,12 +252,6 @@ public:
|
|||
vertices.pop_back();
|
||||
vertices.push_back(vertices[0]);
|
||||
|
||||
std::cout << "VERTICES\n";
|
||||
for(unsigned int i = 0 ; i < vertices.size() ; i++) {
|
||||
std::cout << vertices[i] << std::endl;
|
||||
}
|
||||
std::cout << "END VERTICES\n";
|
||||
|
||||
visibility_region_impl(q);
|
||||
|
||||
typename std::vector<Point_2> points;
|
||||
|
|
@ -298,11 +279,6 @@ public:
|
|||
}
|
||||
|
||||
std::reverse(points.begin(), points.end());
|
||||
std::cout << "POINTS\n";
|
||||
for (unsigned int i = 0 ; i < points.size() ; i++) {
|
||||
std::cout << points[i]<<std::endl;
|
||||
}
|
||||
std::cout << "END POINTS\n";
|
||||
|
||||
CGAL::Visibility_2::report_while_handling_needles
|
||||
<Simple_polygon_visibility_2>(geom_traits,
|
||||
|
|
@ -360,7 +336,6 @@ private:
|
|||
q,
|
||||
vertices[1],
|
||||
vertices[2]) == CGAL::LEFT_TURN) {
|
||||
std::cout << "vrtx left\n";
|
||||
upcase = LEFT;
|
||||
i = 1;
|
||||
w = vertices[1];
|
||||
|
|
@ -370,7 +345,6 @@ private:
|
|||
s.push(vertices[1]);
|
||||
}
|
||||
else {
|
||||
std::cout << "vrtx right\n";
|
||||
upcase = SCANA;
|
||||
i = 1;
|
||||
w = vertices[1];
|
||||
|
|
@ -380,14 +354,12 @@ private:
|
|||
s.push(vertices[1]);
|
||||
}
|
||||
}
|
||||
else if (CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
else {
|
||||
CGAL::Orientation orient = CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
q,
|
||||
vertices[0],
|
||||
vertices[1]) == CGAL::LEFT_TURN
|
||||
|| CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
q,
|
||||
vertices[0],
|
||||
vertices[1]) == CGAL::COLLINEAR) {
|
||||
vertices[1]);
|
||||
if (orient == CGAL::LEFT_TURN || orient == CGAL::COLLINEAR) {
|
||||
|
||||
upcase = LEFT;
|
||||
i = 1;
|
||||
|
|
@ -401,6 +373,7 @@ private:
|
|||
w = vertices[0];
|
||||
s.push(vertices[0]);
|
||||
}
|
||||
}
|
||||
do {
|
||||
switch(upcase) {
|
||||
case LEFT:
|
||||
|
|
@ -420,18 +393,15 @@ private:
|
|||
}
|
||||
|
||||
void left(int& i, Point_2& w, const Point_2& query_pt) {
|
||||
std::cout << "in left\n";
|
||||
if (i == vertices.size() - 1) {
|
||||
upcase = FINISH;
|
||||
}
|
||||
else if (CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
else {
|
||||
CGAL::Orientation orient = CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
vertices[i+1]) == CGAL::LEFT_TURN
|
||||
|| CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
vertices[i+1]) == CGAL::COLLINEAR) {
|
||||
vertices[i+1]);
|
||||
if (orient == CGAL::LEFT_TURN || orient == CGAL::COLLINEAR) {
|
||||
|
||||
upcase = LEFT;
|
||||
s.push(vertices[i+1]);
|
||||
|
|
@ -458,85 +428,54 @@ private:
|
|||
s.push(s_t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void right(int& i, Point_2& w, const Point_2& query_pt) {
|
||||
// Scan s_t, s_t-1, ..., s_1, s_0 for the first edge (s_j, s_j-1) such that
|
||||
// (z, s_j, v_i) is a right turn and (z, s_j-1, v_i) is a left turn, or
|
||||
bool found = false;
|
||||
std::cout << "R: i = " << i << std::endl;
|
||||
std::cout << "right w = " << w << std::endl;
|
||||
std::cout << "R: v[i+1] = " << vertices[i+1] << std::endl;
|
||||
std::cout << "R: v[i-1] = " << vertices[i-1] << std::endl;
|
||||
std::cout << "R: v[i] = " << vertices[i] << std::endl;
|
||||
std::cout << "R: s top = " << s.top() << std::endl;
|
||||
|
||||
while(!found && upcase == RIGHT) {
|
||||
assert(!s.empty());
|
||||
Point_2 s_j = s.top();
|
||||
std::cout << "R s.top = " << s.top();
|
||||
s.pop();
|
||||
assert(!s.empty());
|
||||
Point_2 s_j_prev = s.top();
|
||||
|
||||
if (vertices[i-1] != s_j && CGAL::do_intersect(Segment_2(s_j, s_j_prev), Segment_2(vertices[i-1], vertices[i]))) {
|
||||
std::cout << "R switch to scana\n";
|
||||
upcase = SCANA;
|
||||
found = true;
|
||||
w = s.top();
|
||||
}
|
||||
else {
|
||||
CGAL::Orientation orient = CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
s_j_prev);
|
||||
if (orient == CGAL::RIGHT_TURN || orient == CGAL::COLLINEAR) {
|
||||
|
||||
std::cout << "R: s t-1 = " << s_j_prev << std::endl;
|
||||
assert(CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
s_j) == CGAL::LEFT_TURN
|
||||
|| CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
s_j) == CGAL::COLLINEAR);
|
||||
|
||||
if (CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
s_j_prev) == CGAL::RIGHT_TURN
|
||||
|| CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
s_j_prev) == CGAL::COLLINEAR) {
|
||||
found = true;
|
||||
std::cout << "R found\n";
|
||||
|
||||
if (CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
CGAL::Orientation qwv_orient = CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
vertices[i+1]) == CGAL::RIGHT_TURN) {
|
||||
vertices[i+1]);
|
||||
if (qwv_orient == CGAL::RIGHT_TURN) {
|
||||
|
||||
upcase = RIGHT;
|
||||
w = vertices[i+1];
|
||||
s.push(s_j);
|
||||
i++;
|
||||
std::cout << "R continues with w = " << w << std::endl;
|
||||
}
|
||||
else if ((CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
vertices[i+1]) == CGAL::LEFT_TURN
|
||||
|| CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
vertices[i+1]) == CGAL::COLLINEAR) &&
|
||||
else if ((qwv_orient == CGAL::LEFT_TURN || qwv_orient == CGAL::COLLINEAR) &&
|
||||
(CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
vertices[i-1],
|
||||
vertices[i],
|
||||
vertices[i+1]) == CGAL::RIGHT_TURN)) {
|
||||
std::cout << "in here\n";
|
||||
Segment_2 s1(s_j_prev, s_j);
|
||||
Ray_2 s2(query_pt, w);
|
||||
Object_2 result = CGAL::Visibility_2::Intersect_2
|
||||
<Geometry_traits_2, Segment_2, Ray_2>(geom_traits, s1, s2);
|
||||
if (const Point_2 *ipoint = CGAL::object_cast<Point_2>(&result)) {
|
||||
std::cout << "ipt = " << *ipoint << std::endl;
|
||||
if (i < vertices.size()-1) {
|
||||
|
||||
upcase = LEFT;
|
||||
|
|
@ -552,7 +491,6 @@ private:
|
|||
if (query_pt_is_vertex && *ipoint != s_j_prev) {
|
||||
s.push(*ipoint);
|
||||
}
|
||||
std::cout << "bla\n";
|
||||
upcase = FINISH;
|
||||
}
|
||||
}
|
||||
|
|
@ -562,15 +500,12 @@ private:
|
|||
vertices[i],
|
||||
vertices[i+1]) == CGAL::LEFT_TURN) {
|
||||
|
||||
std::cout << "R: scanc\n";
|
||||
std::cout << "R: " << "v[i-1] = " << vertices[i-1] << " v[i] = " << vertices[i] << " v[i+1] = " << vertices[i+1] << std::endl;
|
||||
upcase = SCANC;
|
||||
w = vertices[i];
|
||||
s.push(s_j);
|
||||
i++;
|
||||
}
|
||||
else {
|
||||
std::cout << "R : left\n";
|
||||
Segment_2 s1(s_j_prev, s_j);
|
||||
Ray_2 s2(query_pt, w);
|
||||
Object_2 result = CGAL::Visibility_2::Intersect_2
|
||||
|
|
@ -592,26 +527,21 @@ private:
|
|||
void scana(int& i, Point_2& w, const Point_2& query_pt) {
|
||||
// Scan v_i, v_i+1, ..., v_n for the first edge to intersect (z, s_t)
|
||||
int k = i;
|
||||
std::cout << "scana w = " << w << std::endl;
|
||||
std::cout << "scana s.top = " << s.top() << std::endl;
|
||||
std::cout << "scana i = " << k << std::endl;
|
||||
std::cout << "scana v[k+1] = " << vertices[k+1] << std::endl;
|
||||
|
||||
while (k+1 < vertices.size()-1) {
|
||||
|
||||
if (CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
while (k+1 < vertices.size()) {
|
||||
CGAL::Orientation qwv_orient = CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
vertices[k+1]) == CGAL::LEFT_TURN) {
|
||||
vertices[k+1]);
|
||||
if (qwv_orient == CGAL::LEFT_TURN) {
|
||||
|
||||
Ray_2 s2(query_pt, s.top());
|
||||
Segment_2 s1(vertices[k], vertices[k+1]);
|
||||
std::cout << "scana s1 = " << s1 << std::endl;
|
||||
|
||||
Object_2 result = CGAL::Visibility_2::Intersect_2
|
||||
<Geometry_traits_2, Segment_2, Ray_2>(geom_traits, s1, s2);
|
||||
if (const Point_2 *ipoint = CGAL::object_cast<Point_2>(&result)) {
|
||||
s.push(*ipoint);
|
||||
std::cout << "scana ipt = " << *ipoint << std::endl;
|
||||
s.push(vertices[k+1]);
|
||||
w = vertices[k+1];
|
||||
i = k+1;
|
||||
|
|
@ -619,12 +549,9 @@ private:
|
|||
break;
|
||||
}
|
||||
}
|
||||
else if (CGAL::Visibility_2::Orientation_2(geom_traits,
|
||||
query_pt,
|
||||
w,
|
||||
vertices[k+1]) == CGAL::COLLINEAR) {
|
||||
else if (qwv_orient == CGAL::COLLINEAR) {
|
||||
|
||||
if (!query_pt_is_vertex && !query_pt_is_on_halfedge) {
|
||||
std::cout << "scana collinear\n";
|
||||
s.push(vertices[k+1]);
|
||||
w = vertices[k+1];
|
||||
i = k+1;
|
||||
|
|
@ -634,7 +561,6 @@ private:
|
|||
if ((query_pt_is_vertex || query_pt_is_on_halfedge)
|
||||
&& CGAL::collinear_are_ordered_along_line(query_pt, w, vertices[k+1])) {
|
||||
|
||||
std::cout << "scana SPECIAL collinear\n";
|
||||
s.push(vertices[k+1]);
|
||||
w = vertices[k+1];
|
||||
i = k+1;
|
||||
|
|
@ -644,8 +570,6 @@ private:
|
|||
}
|
||||
k++;
|
||||
}
|
||||
std::cout << "scana w = " << w << std::endl;
|
||||
std::cout << "scana i = " << i << std::endl;
|
||||
}
|
||||
|
||||
void scanc(int& i, Point_2& w, const Point_2& query_pt) {
|
||||
|
|
@ -655,15 +579,13 @@ private:
|
|||
int k = i;
|
||||
Point_2 intersection_pt;
|
||||
while (k < vertices.size()-1) {
|
||||
if (CGAL::Visibility_2::Orientation_2(geom_traits, query_pt, w, vertices[k]) == CGAL::RIGHT_TURN
|
||||
||CGAL::Visibility_2::Orientation_2(geom_traits, query_pt, w, vertices[k]) == CGAL::COLLINEAR) {
|
||||
CGAL::Orientation qwv_orient = CGAL::Visibility_2::Orientation_2(geom_traits, query_pt, w, vertices[k]);
|
||||
if (qwv_orient == CGAL::RIGHT_TURN || qwv_orient == CGAL::COLLINEAR) {
|
||||
break;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
w = vertices[k];
|
||||
std::cout << "scanc w = " << w << std::endl;
|
||||
std::cout << "scanc i = " << i << std::endl;
|
||||
i = k;
|
||||
upcase = RIGHT;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue