change the interface of is_closer()

This commit is contained in:
kanhuang 2013-09-11 14:06:46 -04:00
parent b64af4e611
commit b69f2623ea
1 changed files with 88 additions and 18 deletions

View File

@ -311,6 +311,12 @@ private:
vs[i+l+right.size()] = left[left.size()-1-l];
}
void print_edx() {
for (int i=0; i<heap.size(); i++) {
std::cout<<i<<':'<< heap[i].first<<','<<heap[i].second<<std::endl;
}
assert(false);
}
void visibility_region_impl(const Face_const_handle f, const Point_2& q) {
@ -342,7 +348,13 @@ private:
for (int i=0; i!=good_edges.size(); i++) {
if (do_intersect_ray(q, dp, good_edges[i].first, good_edges[i].second))
heap_insert(good_edges[i]);
// heap.push_back(good_edges[i]);
}
// std::make_heap(heap.begin(), heap.end(), Is_closer(q, geom_traits));
// for (int i=0; i!=heap.size(); i++) {
// edx[heap[i]] = i;
// }
// print_edx();
}
else {
Ccb_halfedge_const_circulator curr = f->outer_ccb();
@ -367,6 +379,7 @@ private:
}
//angular sweep begins
for (int i=0; i!=vs.size(); i++) {
dp = vs[i];
@ -445,7 +458,7 @@ private:
int i = heap.size()-1;
edx[e] = i;
int parent = (i-1)/2;
while (i!=0 && is_closer(q, heap[i].first, heap[i].second, heap[parent].first, heap[parent].second)){
while (i!=0 && is_closer(q, heap[i], heap[parent])){
heap_swap(i, parent);
i = parent;
parent = (i-1)/2;
@ -470,7 +483,7 @@ private:
int i_before_swap = i;
int parent = (i-1)/2;
while (i!=0 && is_closer(q, heap[i].first, heap[i].second, heap[parent].first, heap[parent].second)){
while (i!=0 && is_closer(q, heap[i], heap[parent])){
heap_swap(i, parent);
i = parent;
parent = (i-1)/2;
@ -481,18 +494,10 @@ private:
int left_son = i*2+1;
int right_son = i*2+2;
int closest_idx = i;
if (left_son < heap.size() && is_closer(q,
heap[left_son].first,
heap[left_son].second,
heap[i].first,
heap[i].second)) {
if (left_son < heap.size() && is_closer(q, heap[left_son], heap[i])) {
closest_idx = left_son;
}
if (right_son < heap.size() && is_closer(q,
heap[right_son].first,
heap[right_son].second,
heap[closest_idx].first,
heap[closest_idx].second)) {
if (right_son < heap.size() && is_closer(q, heap[right_son], heap[closest_idx])) {
closest_idx = right_son;
}
swapped = false;
@ -526,13 +531,75 @@ private:
std::cout<<p.x()<<','<<p.y()<<std::endl;
}
class Is_closer:public std::binary_function<Pair, Pair, bool> {
const Point_2& q;
const Geometry_traits_2* geom_traits;
public:
Is_closer(const Point_2& q, const Geometry_traits_2* traits): q(q) {
geom_traits = traits;
}
bool operator() (const Pair& e1, const Pair& e2) const {
const Point_2& s1=e1.first, t1=e1.second, s2=e2.first, t2=e2.second;
Orientation e1q = Visibility_2::orientation_2(geom_traits, s1, t1, q);
switch (e1q)
{
case COLLINEAR:
if (Visibility_2::collinear(geom_traits, q, s2, t2)) {
//q is collinear with e1 and e2.
return (Visibility_2::less_distance_to_point_2(geom_traits, q, s1, s2)
|| Visibility_2::less_distance_to_point_2(geom_traits, q, t1, t2));
}
else {
//q is not collinear with e2. q is collinear with e1.
if (Visibility_2::collinear(geom_traits, s2, t2, s1))
return (Visibility_2::orientation_2(geom_traits, s2, t2, q)
== Visibility_2::orientation_2(geom_traits, s2, t2, t1));
else
return (Visibility_2::orientation_2(geom_traits, s2, t2, q)
== Visibility_2::orientation_2(geom_traits, s2, t2, s1));
}
case RIGHT_TURN:
switch (Visibility_2::orientation_2(geom_traits, s1, t1, s2)) {
case COLLINEAR:
return Visibility_2::orientation_2(geom_traits, s1, t1, t2)!=e1q;
case RIGHT_TURN:
if (Visibility_2::orientation_2(geom_traits, s1, t1, t2) == LEFT_TURN)
return Visibility_2::orientation_2(geom_traits, s2, t2, q)
== Visibility_2::orientation_2(geom_traits, s2, t2, s1);
else
return false;
case LEFT_TURN:
if (Visibility_2::orientation_2(geom_traits, s1, t1, t2) == RIGHT_TURN)
return Visibility_2::orientation_2(geom_traits, s2, t2, q)
== Visibility_2::orientation_2(geom_traits, s2, t2, s1);
else
return true;
}
case LEFT_TURN:
switch (Visibility_2::orientation_2(geom_traits, s1, t1, s2)) {
case COLLINEAR:
return Visibility_2::orientation_2(geom_traits, s1, t1, t2)!=e1q;
case LEFT_TURN:
if (Visibility_2::orientation_2(geom_traits, s1, t1, t2) == RIGHT_TURN)
return Visibility_2::orientation_2(geom_traits, s2, t2, q)
== Visibility_2::orientation_2(geom_traits, s2, t2, s1);
else
return false;
case RIGHT_TURN:
if (Visibility_2::orientation_2(geom_traits, s1, t1, t2) == LEFT_TURN)
return Visibility_2::orientation_2(geom_traits, s2, t2, q)
== Visibility_2::orientation_2(geom_traits, s2, t2, s1);
else
return true;
}
}
}
};
bool is_closer(const Point_2& q,
const Point_2& s1,
const Point_2& t1,
const Point_2& s2,
const Point_2& t2) {
const Pair& e1,
const Pair& e2) {
const Point_2& s1=e1.first, t1=e1.second, s2=e2.first, t2=e2.second;
Orientation e1q = Visibility_2::orientation_2(geom_traits, s1, t1, q);
switch (e1q)
{
@ -710,7 +777,8 @@ private:
polygon.push_back(p);
else
{
if (polygon.back() != p){
// if (polygon.back() != p){
if (Visibility_2::compare_xy_2(geom_traits, polygon.back(), p) != EQUAL) {
polygon.push_back(p);
}
}
@ -754,6 +822,8 @@ private:
};
bool is_sweeped_first(const Point_2& p1, const Point_2& p2)
{
int qua1 = quadrant(q, p1);