Polygon: moving from index to sorted_index for the site events.
[SVN r78759]
This commit is contained in:
parent
b8b93d63ba
commit
cb4b70dfaf
@ -406,10 +406,10 @@ public:
|
||||
return !predicate_(node2.left_site(), node2.right_site(), site1);
|
||||
} else {
|
||||
// This checks were evaluated experimentally.
|
||||
if (site1.index() == site2.index()) {
|
||||
if (site1.sorted_index() == site2.sorted_index()) {
|
||||
// Both nodes are new (inserted during same site event processing).
|
||||
return get_comparison_y(node1) < get_comparison_y(node2);
|
||||
} else if (site1.index() < site2.index()) {
|
||||
} else if (site1.sorted_index() < site2.sorted_index()) {
|
||||
std::pair<coordinate_type, int> y1 = get_comparison_y(node1, false);
|
||||
std::pair<coordinate_type, int> y2 = get_comparison_y(node2, true);
|
||||
if (y1.first != y2.first) return y1.first < y2.first;
|
||||
@ -426,7 +426,7 @@ public:
|
||||
private:
|
||||
// Get the newer site.
|
||||
const site_type &get_comparison_site(const node_type &node) const {
|
||||
if (node.left_site().index() > node.right_site().index()) {
|
||||
if (node.left_site().sorted_index() > node.right_site().sorted_index()) {
|
||||
return node.left_site();
|
||||
}
|
||||
return node.right_site();
|
||||
@ -435,10 +435,11 @@ public:
|
||||
// Get comparison pair: y coordinate and direction of the newer site.
|
||||
std::pair<coordinate_type, int> get_comparison_y(
|
||||
const node_type &node, bool is_new_node = true) const {
|
||||
if (node.left_site().index() == node.right_site().index()) {
|
||||
if (node.left_site().sorted_index() ==
|
||||
node.right_site().sorted_index()) {
|
||||
return std::make_pair(node.left_site().y(), 0);
|
||||
}
|
||||
if (node.left_site().index() > node.right_site().index()) {
|
||||
if (node.left_site().sorted_index() > node.right_site().sorted_index()) {
|
||||
if (!is_new_node &&
|
||||
node.left_site().is_segment() &&
|
||||
is_vertical(node.left_site())) {
|
||||
|
@ -91,39 +91,39 @@ public:
|
||||
site_event() :
|
||||
point0_(0, 0),
|
||||
point1_(0, 0),
|
||||
site_index_(0) {}
|
||||
sorted_index_(0) {}
|
||||
|
||||
site_event(coordinate_type x, coordinate_type y) :
|
||||
point0_(x, y),
|
||||
point1_(x, y),
|
||||
site_index_(0) {}
|
||||
sorted_index_(0) {}
|
||||
|
||||
site_event(const point_type &point) :
|
||||
point0_(point),
|
||||
point1_(point),
|
||||
site_index_(0) {}
|
||||
sorted_index_(0) {}
|
||||
|
||||
site_event(coordinate_type x1, coordinate_type y1,
|
||||
coordinate_type x2, coordinate_type y2):
|
||||
point0_(x1, y1),
|
||||
point1_(x2, y2),
|
||||
site_index_(0) {}
|
||||
sorted_index_(0) {}
|
||||
|
||||
site_event(const point_type &point1, const point_type &point2) :
|
||||
point0_(point1),
|
||||
point1_(point2),
|
||||
site_index_(0) {}
|
||||
sorted_index_(0) {}
|
||||
|
||||
bool operator==(const site_event &that) const {
|
||||
return (this->point0_ == that.point0_) &&
|
||||
(this->point1_ == that.point1_) &&
|
||||
(this->site_index_ == that.site_index_);
|
||||
(this->sorted_index_ == that.sorted_index_);
|
||||
}
|
||||
|
||||
bool operator!=(const site_event &that) const {
|
||||
return (this->point0_ != that.point0_) ||
|
||||
(this->point1_ != that.point1_) ||
|
||||
(this->site_index_ != that.site_index_);
|
||||
(this->sorted_index_ != that.sorted_index_);
|
||||
}
|
||||
|
||||
coordinate_type x(bool oriented = false) const {
|
||||
@ -170,23 +170,23 @@ public:
|
||||
return is_inverse() ? point0_ : point1_;
|
||||
}
|
||||
|
||||
site_event& index(int index) {
|
||||
site_index_ = (index << 2) + (site_index_ & 3);
|
||||
site_event& sorted_index(std::size_t index) {
|
||||
sorted_index_ = (index << 2) + (sorted_index_ & 3);
|
||||
return *this;
|
||||
}
|
||||
|
||||
site_event& inverse() {
|
||||
site_index_ ^= IS_INVERSE;
|
||||
sorted_index_ ^= IS_INVERSE;
|
||||
return *this;
|
||||
}
|
||||
|
||||
site_event& change_initial_direction() {
|
||||
site_index_ ^= HAS_INITIAL_DIRECTION;
|
||||
sorted_index_ ^= HAS_INITIAL_DIRECTION;
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::size_t index() const {
|
||||
return site_index_ >> 2;
|
||||
std::size_t sorted_index() const {
|
||||
return sorted_index_ >> 2;
|
||||
}
|
||||
|
||||
bool is_point() const {
|
||||
@ -198,11 +198,11 @@ public:
|
||||
}
|
||||
|
||||
bool is_inverse() const {
|
||||
return (site_index_ & IS_INVERSE) ? true : false;
|
||||
return (sorted_index_ & IS_INVERSE) ? true : false;
|
||||
}
|
||||
|
||||
bool is_initial() const {
|
||||
return (site_index_ & HAS_INITIAL_DIRECTION) ? false : true;
|
||||
return (sorted_index_ & HAS_INITIAL_DIRECTION) ? false : true;
|
||||
}
|
||||
|
||||
bool has_initial_direction() const {
|
||||
@ -217,7 +217,7 @@ private:
|
||||
|
||||
point_type point0_;
|
||||
point_type point1_;
|
||||
unsigned int site_index_;
|
||||
std::size_t sorted_index_;
|
||||
};
|
||||
|
||||
// Circle event type.
|
||||
|
@ -639,7 +639,7 @@ namespace boost { namespace polygon{
|
||||
int or2_2 = orientation(segment2, high(segment1));
|
||||
if (or2_1 * or2_2 > 0)
|
||||
return false;
|
||||
if (consider_touch || or1_1 && or1_2 || or2_1 && or2_2)
|
||||
if (consider_touch || (or1_1 && or1_2) || (or2_1 && or2_2))
|
||||
return true;
|
||||
if (or1_1 || or1_2)
|
||||
return false;
|
||||
|
@ -162,7 +162,7 @@ private:
|
||||
|
||||
// Index sites.
|
||||
for (std::size_t cur = 0; cur < site_events_.size(); ++cur)
|
||||
site_events_[cur].index(cur);
|
||||
site_events_[cur].sorted_index(cur);
|
||||
|
||||
// Init site iterator.
|
||||
site_event_iterator_ = site_events_.begin();
|
||||
|
@ -396,8 +396,8 @@ private:
|
||||
std::pair<void*, void*> insert_new_edge(
|
||||
const SEvent &site1, const SEvent &site2) {
|
||||
// Get sites' indexes.
|
||||
int site_index1 = site1.index();
|
||||
int site_index2 = site2.index();
|
||||
int site_index1 = site1.sorted_index();
|
||||
int site_index2 = site2.sorted_index();
|
||||
|
||||
// Create a new half-edge that belongs to the first site.
|
||||
edges_.push_back(edge_type());
|
||||
@ -454,12 +454,12 @@ private:
|
||||
// Add a new half-edge.
|
||||
edges_.push_back(edge_type());
|
||||
edge_type &new_edge1 = edges_.back();
|
||||
new_edge1.cell(&cells_[site1.index()]);
|
||||
new_edge1.cell(&cells_[site1.sorted_index()]);
|
||||
|
||||
// Add a new half-edge.
|
||||
edges_.push_back(edge_type());
|
||||
edge_type &new_edge2 = edges_.back();
|
||||
new_edge2.cell(&cells_[site3.index()]);
|
||||
new_edge2.cell(&cells_[site3.sorted_index()]);
|
||||
|
||||
// Update twin pointers.
|
||||
new_edge1.twin(&new_edge2);
|
||||
|
@ -257,11 +257,11 @@ BOOST_AUTO_TEST_CASE(distatnce_predicate_test8) {
|
||||
BOOST_AUTO_TEST_CASE(node_comparison_test1) {
|
||||
beach_line_type beach_line;
|
||||
site_type site1(0, 0);
|
||||
site1.index(0);
|
||||
site1.sorted_index(0);
|
||||
site_type site2(0, 2);
|
||||
site2.index(1);
|
||||
site2.sorted_index(1);
|
||||
site_type site3(1, 0);
|
||||
site3.index(2);
|
||||
site3.sorted_index(2);
|
||||
beach_line[key_type(site1, site2)] = 2;
|
||||
beach_line[key_type(site1, site3)] = 0;
|
||||
beach_line[key_type(site3, site1)] = 1;
|
||||
@ -275,11 +275,11 @@ BOOST_AUTO_TEST_CASE(node_comparison_test1) {
|
||||
BOOST_AUTO_TEST_CASE(node_comparison_test2) {
|
||||
beach_line_type beach_line;
|
||||
site_type site1(0, 1);
|
||||
site1.index(0);
|
||||
site1.sorted_index(0);
|
||||
site_type site2(2, 0);
|
||||
site2.index(1);
|
||||
site2.sorted_index(1);
|
||||
site_type site3(2, 4);
|
||||
site3.index(2);
|
||||
site3.sorted_index(2);
|
||||
beach_line[key_type(site1, site2)] = 0;
|
||||
beach_line[key_type(site2, site1)] = 1;
|
||||
beach_line[key_type(site1, site3)] = 2;
|
||||
@ -292,80 +292,80 @@ BOOST_AUTO_TEST_CASE(node_comparison_test2) {
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(node_comparison_test3) {
|
||||
key_type node(site_type(1, 0).index(1), site_type(0, 2).index(0));
|
||||
key_type node(site_type(1, 0).sorted_index(1), site_type(0, 2).sorted_index(0));
|
||||
key_type nodes[] = {
|
||||
key_type(site_type(2, -10).index(2)),
|
||||
key_type(site_type(2, -1).index(2)),
|
||||
key_type(site_type(2, 0).index(2)),
|
||||
key_type(site_type(2, 1).index(2)),
|
||||
key_type(site_type(2, 2).index(2)),
|
||||
key_type(site_type(2, 3).index(2)),
|
||||
key_type(site_type(2, -10).sorted_index(2)),
|
||||
key_type(site_type(2, -1).sorted_index(2)),
|
||||
key_type(site_type(2, 0).sorted_index(2)),
|
||||
key_type(site_type(2, 1).sorted_index(2)),
|
||||
key_type(site_type(2, 2).sorted_index(2)),
|
||||
key_type(site_type(2, 3).sorted_index(2)),
|
||||
};
|
||||
bool res[] = {false, false, false, false, true, true};
|
||||
CHECK_NODE_COMPARISON(node, nodes, res, 6);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(node_comparison_test4) {
|
||||
key_type node(site_type(0, 1).index(0), site_type(1, 0).index(1));
|
||||
key_type node(site_type(0, 1).sorted_index(0), site_type(1, 0).sorted_index(1));
|
||||
key_type nodes[] = {
|
||||
key_type(site_type(2, -3).index(2)),
|
||||
key_type(site_type(2, -2).index(2)),
|
||||
key_type(site_type(2, -1).index(2)),
|
||||
key_type(site_type(2, 0).index(2)),
|
||||
key_type(site_type(2, 1).index(2)),
|
||||
key_type(site_type(2, 3).index(2)),
|
||||
key_type(site_type(2, -3).sorted_index(2)),
|
||||
key_type(site_type(2, -2).sorted_index(2)),
|
||||
key_type(site_type(2, -1).sorted_index(2)),
|
||||
key_type(site_type(2, 0).sorted_index(2)),
|
||||
key_type(site_type(2, 1).sorted_index(2)),
|
||||
key_type(site_type(2, 3).sorted_index(2)),
|
||||
};
|
||||
bool res[] = {false, true, true, true, true, true};
|
||||
CHECK_NODE_COMPARISON(node, nodes, res, 6);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(node_comparison_test5) {
|
||||
key_type node(site_type(0, 0).index(0), site_type(1, 2).index(1));
|
||||
key_type node(site_type(0, 0).sorted_index(0), site_type(1, 2).sorted_index(1));
|
||||
key_type nodes[] = {
|
||||
key_type(site_type(2, -10).index(2)),
|
||||
key_type(site_type(2, 0).index(2)),
|
||||
key_type(site_type(2, 1).index(2)),
|
||||
key_type(site_type(2, 2).index(2)),
|
||||
key_type(site_type(2, 5).index(2)),
|
||||
key_type(site_type(2, 20).index(2)),
|
||||
key_type(site_type(2, -10).sorted_index(2)),
|
||||
key_type(site_type(2, 0).sorted_index(2)),
|
||||
key_type(site_type(2, 1).sorted_index(2)),
|
||||
key_type(site_type(2, 2).sorted_index(2)),
|
||||
key_type(site_type(2, 5).sorted_index(2)),
|
||||
key_type(site_type(2, 20).sorted_index(2)),
|
||||
};
|
||||
bool res[] = {false, false, true, true, true, true};
|
||||
CHECK_NODE_COMPARISON(node, nodes, res, 6);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(node_comparison_test6) {
|
||||
key_type node(site_type(1, 1).index(1), site_type(0, 0).index(0));
|
||||
key_type node(site_type(1, 1).sorted_index(1), site_type(0, 0).sorted_index(0));
|
||||
key_type nodes [] = {
|
||||
key_type(site_type(2, -3).index(2)),
|
||||
key_type(site_type(2, -2).index(2)),
|
||||
key_type(site_type(2, 0).index(2)),
|
||||
key_type(site_type(2, 1).index(2)),
|
||||
key_type(site_type(2, 2).index(2)),
|
||||
key_type(site_type(2, 3).index(2)),
|
||||
key_type(site_type(2, 5).index(2)),
|
||||
key_type(site_type(2, -3).sorted_index(2)),
|
||||
key_type(site_type(2, -2).sorted_index(2)),
|
||||
key_type(site_type(2, 0).sorted_index(2)),
|
||||
key_type(site_type(2, 1).sorted_index(2)),
|
||||
key_type(site_type(2, 2).sorted_index(2)),
|
||||
key_type(site_type(2, 3).sorted_index(2)),
|
||||
key_type(site_type(2, 5).sorted_index(2)),
|
||||
};
|
||||
bool res[] = {false, false, false, false, false, false, true};
|
||||
CHECK_NODE_COMPARISON(node, nodes, res, 7);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(node_comparison_test7) {
|
||||
key_type node(site_type(0, 0).index(0), site_type(0, 2).index(1));
|
||||
key_type node(site_type(0, 0).sorted_index(0), site_type(0, 2).sorted_index(1));
|
||||
key_type nodes[] = {
|
||||
key_type(site_type(1, 0).index(2)),
|
||||
key_type(site_type(1, 1).index(2)),
|
||||
key_type(site_type(1, 2).index(2)),
|
||||
key_type(site_type(1, 0).sorted_index(2)),
|
||||
key_type(site_type(1, 1).sorted_index(2)),
|
||||
key_type(site_type(1, 2).sorted_index(2)),
|
||||
};
|
||||
bool res[] = {false, false, true};
|
||||
CHECK_NODE_COMPARISON(node, nodes, res, 3);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(node_comparison_test8) {
|
||||
key_type node(site_type(0, 0).index(0), site_type(1, 1).index(2));
|
||||
key_type node(site_type(0, 0).sorted_index(0), site_type(1, 1).sorted_index(2));
|
||||
key_type nodes[] = {
|
||||
key_type(site_type(1, 0).index(1)),
|
||||
key_type(site_type(1, 1).index(2)),
|
||||
key_type(site_type(1, 2).index(3)),
|
||||
key_type(site_type(1, 1).index(2), site_type(0, 0).index(0)),
|
||||
key_type(site_type(1, 0).sorted_index(1)),
|
||||
key_type(site_type(1, 1).sorted_index(2)),
|
||||
key_type(site_type(1, 2).sorted_index(3)),
|
||||
key_type(site_type(1, 1).sorted_index(2), site_type(0, 0).sorted_index(0)),
|
||||
};
|
||||
bool res[] = {false, true, true, true};
|
||||
CHECK_NODE_COMPARISON(node, nodes, res, 4);
|
||||
|
@ -34,11 +34,11 @@ BOOST_AUTO_TEST_CASE(site_event_test2) {
|
||||
site_type s(1, 2);
|
||||
BOOST_CHECK(s.x0() == s.x1() && s.x1() == 1);
|
||||
BOOST_CHECK(s.y0() == s.y1() && s.y1() == 2);
|
||||
BOOST_CHECK(s.index() == 0);
|
||||
BOOST_CHECK(s.sorted_index() == 0);
|
||||
BOOST_CHECK(!s.is_segment());
|
||||
BOOST_CHECK(!s.is_inverse());
|
||||
s.index(1);
|
||||
BOOST_CHECK(s.index() == 1);
|
||||
s.sorted_index(1);
|
||||
BOOST_CHECK(s.sorted_index() == 1);
|
||||
BOOST_CHECK(!s.is_inverse());
|
||||
}
|
||||
|
||||
@ -48,7 +48,7 @@ BOOST_AUTO_TEST_CASE(site_event_test3) {
|
||||
BOOST_CHECK(s.y0(true) == 2 && s.y0() == 2);
|
||||
BOOST_CHECK(s.x1(true) == 3 && s.x1() == 3);
|
||||
BOOST_CHECK(s.y1(true) == 4 && s.y1() == 4);
|
||||
BOOST_CHECK(s.index() == 0);
|
||||
BOOST_CHECK(s.sorted_index() == 0);
|
||||
BOOST_CHECK(s.is_segment());
|
||||
BOOST_CHECK(!s.is_inverse());
|
||||
s.inverse();
|
||||
@ -61,18 +61,18 @@ BOOST_AUTO_TEST_CASE(site_event_test3) {
|
||||
|
||||
BOOST_AUTO_TEST_CASE(site_event_test4) {
|
||||
site_type s(1, 2, 3, 4);
|
||||
s.index(27);
|
||||
s.sorted_index(27);
|
||||
BOOST_CHECK(s.is_initial());
|
||||
BOOST_CHECK(s.has_initial_direction());
|
||||
BOOST_CHECK(s.index() == 27);
|
||||
BOOST_CHECK(s.sorted_index() == 27);
|
||||
s.inverse();
|
||||
BOOST_CHECK(!s.has_initial_direction());
|
||||
BOOST_CHECK(s.is_initial());
|
||||
BOOST_CHECK(s.index() == 27);
|
||||
BOOST_CHECK(s.sorted_index() == 27);
|
||||
s.change_initial_direction();
|
||||
BOOST_CHECK(s.has_initial_direction());
|
||||
BOOST_CHECK(!s.is_initial());
|
||||
BOOST_CHECK(s.index() == 27);
|
||||
BOOST_CHECK(s.sorted_index() == 27);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(circle_event_test) {
|
||||
|
Loading…
Reference in New Issue
Block a user