mirror of https://github.com/CGAL/cgal
change the interface of is_closer()
This commit is contained in:
parent
b64af4e611
commit
b69f2623ea
|
|
@ -311,6 +311,12 @@ private:
|
||||||
vs[i+l+right.size()] = left[left.size()-1-l];
|
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) {
|
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++) {
|
for (int i=0; i!=good_edges.size(); i++) {
|
||||||
if (do_intersect_ray(q, dp, good_edges[i].first, good_edges[i].second))
|
if (do_intersect_ray(q, dp, good_edges[i].first, good_edges[i].second))
|
||||||
heap_insert(good_edges[i]);
|
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 {
|
else {
|
||||||
Ccb_halfedge_const_circulator curr = f->outer_ccb();
|
Ccb_halfedge_const_circulator curr = f->outer_ccb();
|
||||||
|
|
@ -367,6 +379,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//angular sweep begins
|
//angular sweep begins
|
||||||
for (int i=0; i!=vs.size(); i++) {
|
for (int i=0; i!=vs.size(); i++) {
|
||||||
dp = vs[i];
|
dp = vs[i];
|
||||||
|
|
@ -445,7 +458,7 @@ private:
|
||||||
int i = heap.size()-1;
|
int i = heap.size()-1;
|
||||||
edx[e] = i;
|
edx[e] = i;
|
||||||
int parent = (i-1)/2;
|
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);
|
heap_swap(i, parent);
|
||||||
i = parent;
|
i = parent;
|
||||||
parent = (i-1)/2;
|
parent = (i-1)/2;
|
||||||
|
|
@ -470,7 +483,7 @@ private:
|
||||||
int i_before_swap = i;
|
int i_before_swap = i;
|
||||||
|
|
||||||
int parent = (i-1)/2;
|
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);
|
heap_swap(i, parent);
|
||||||
i = parent;
|
i = parent;
|
||||||
parent = (i-1)/2;
|
parent = (i-1)/2;
|
||||||
|
|
@ -481,18 +494,10 @@ private:
|
||||||
int left_son = i*2+1;
|
int left_son = i*2+1;
|
||||||
int right_son = i*2+2;
|
int right_son = i*2+2;
|
||||||
int closest_idx = i;
|
int closest_idx = i;
|
||||||
if (left_son < heap.size() && is_closer(q,
|
if (left_son < heap.size() && is_closer(q, heap[left_son], heap[i])) {
|
||||||
heap[left_son].first,
|
|
||||||
heap[left_son].second,
|
|
||||||
heap[i].first,
|
|
||||||
heap[i].second)) {
|
|
||||||
closest_idx = left_son;
|
closest_idx = left_son;
|
||||||
}
|
}
|
||||||
if (right_son < heap.size() && is_closer(q,
|
if (right_son < heap.size() && is_closer(q, heap[right_son], heap[closest_idx])) {
|
||||||
heap[right_son].first,
|
|
||||||
heap[right_son].second,
|
|
||||||
heap[closest_idx].first,
|
|
||||||
heap[closest_idx].second)) {
|
|
||||||
closest_idx = right_son;
|
closest_idx = right_son;
|
||||||
}
|
}
|
||||||
swapped = false;
|
swapped = false;
|
||||||
|
|
@ -526,13 +531,75 @@ private:
|
||||||
std::cout<<p.x()<<','<<p.y()<<std::endl;
|
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,
|
bool is_closer(const Point_2& q,
|
||||||
const Point_2& s1,
|
const Pair& e1,
|
||||||
const Point_2& t1,
|
const Pair& e2) {
|
||||||
const Point_2& s2,
|
const Point_2& s1=e1.first, t1=e1.second, s2=e2.first, t2=e2.second;
|
||||||
const Point_2& t2) {
|
|
||||||
Orientation e1q = Visibility_2::orientation_2(geom_traits, s1, t1, q);
|
Orientation e1q = Visibility_2::orientation_2(geom_traits, s1, t1, q);
|
||||||
switch (e1q)
|
switch (e1q)
|
||||||
{
|
{
|
||||||
|
|
@ -710,7 +777,8 @@ private:
|
||||||
polygon.push_back(p);
|
polygon.push_back(p);
|
||||||
else
|
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);
|
polygon.push_back(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -754,6 +822,8 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool is_sweeped_first(const Point_2& p1, const Point_2& p2)
|
bool is_sweeped_first(const Point_2& p1, const Point_2& p2)
|
||||||
{
|
{
|
||||||
int qua1 = quadrant(q, p1);
|
int qua1 = quadrant(q, p1);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue