mirror of https://github.com/KLayout/klayout.git
WIP (quad tree)
This commit is contained in:
parent
5c8e0539ee
commit
f1f35ae2a4
|
|
@ -290,22 +290,26 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
box_type b = BC () (value);
|
box_type b = BC () (value);
|
||||||
int n = quad_for (b);
|
if (b.inside (box (ucenter))) {
|
||||||
|
|
||||||
|
int n = quad_for (b);
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
m_objects.push_back (value);
|
m_objects.push_back (value);
|
||||||
return;
|
} else {
|
||||||
}
|
|
||||||
|
|
||||||
if (b.inside (box (ucenter))) {
|
|
||||||
if (! m_q[n]) {
|
if (! m_q[n]) {
|
||||||
box_type bq = q (n, ucenter);
|
box_type bq = q (n, ucenter);
|
||||||
m_q[n] = new quad_tree_node (bq.center ());
|
m_q[n] = new quad_tree_node (bq.center ());
|
||||||
}
|
}
|
||||||
m_q[n]->insert (value, m_center);
|
m_q[n]->insert (value, m_center);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
grow (m_center - (m_center - ucenter) * 2.0);
|
|
||||||
insert (value, ucenter);
|
tl_assert (m_q[0] || m_q[1] || m_q[2] || m_q[3]);
|
||||||
|
point_type new_ucenter = m_center - (m_center - ucenter) * 2.0;
|
||||||
|
grow (new_ucenter);
|
||||||
|
insert (value, new_ucenter);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -317,6 +321,7 @@ private:
|
||||||
if (m_q[i]) {
|
if (m_q[i]) {
|
||||||
quad_tree_node *n = m_q[i];
|
quad_tree_node *n = m_q[i];
|
||||||
m_q[i] = new quad_tree_node (q (i, ucenter).center ());
|
m_q[i] = new quad_tree_node (q (i, ucenter).center ());
|
||||||
|
m_q[i]->m_split = true;
|
||||||
m_q[i]->m_q[3 - i] = n;
|
m_q[i]->m_q[3 - i] = n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -470,6 +475,8 @@ public:
|
||||||
|
|
||||||
while (! m_stack.empty ()) {
|
while (! m_stack.empty ()) {
|
||||||
|
|
||||||
|
qn = m_stack.back ().first;
|
||||||
|
|
||||||
int &n = m_stack.back ().second;
|
int &n = m_stack.back ().second;
|
||||||
while (++n < 4) {
|
while (++n < 4) {
|
||||||
box_type bq = qn->q_box (n);
|
box_type bq = qn->q_box (n);
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,8 @@
|
||||||
#include "tlUnitTest.h"
|
#include "tlUnitTest.h"
|
||||||
#include "tlString.h"
|
#include "tlString.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
typedef db::quad_tree<db::DBox, db::box_convert<db::DBox>, size_t (1)> my_quad_tree;
|
typedef db::quad_tree<db::DBox, db::box_convert<db::DBox>, size_t (1)> my_quad_tree;
|
||||||
|
|
||||||
std::string find_all (const my_quad_tree &qt)
|
std::string find_all (const my_quad_tree &qt)
|
||||||
|
|
@ -256,6 +258,58 @@ TEST(remove)
|
||||||
EXPECT_EQ (tree.levels (), size_t (1));
|
EXPECT_EQ (tree.levels (), size_t (1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(grow)
|
||||||
|
{
|
||||||
|
my_quad_tree tree;
|
||||||
|
tree.insert (db::DBox (-1, -2, 3, 4));
|
||||||
|
tree.insert (db::DBox (-1, -3, 3, 0));
|
||||||
|
tree.insert (db::DBox (-1, -3, -0.5, -2));
|
||||||
|
tree.insert (db::DBox (-1, -3, -0.5, 2));
|
||||||
|
EXPECT_EQ (tree.levels (), size_t (2));
|
||||||
|
tree.insert (db::DBox (-100, -3, -99, 2));
|
||||||
|
EXPECT_EQ (tree.levels (), size_t (8));
|
||||||
|
|
||||||
|
EXPECT_EQ (tree.check (), true);
|
||||||
|
EXPECT_EQ (find_all (tree), "(-1,-2;3,4)/(-1,-3;-0.5,-2)/(-1,-3;-0.5,2)/(-1,-3;3,0)/(-100,-3;-99,2)");
|
||||||
|
EXPECT_EQ (find_overlapping (tree, db::DBox (-100, -100, -90, 100)), "(-100,-3;-99,2)");
|
||||||
|
|
||||||
|
bool r = true;
|
||||||
|
while (r && ! tree.empty ()) {
|
||||||
|
r = tree.erase (*tree.begin ());
|
||||||
|
EXPECT_EQ (r, true);
|
||||||
|
EXPECT_EQ (tree.check (), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_EQ (tree.size (), size_t (0));
|
||||||
|
EXPECT_EQ (tree.levels (), size_t (1));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(grow2)
|
||||||
|
{
|
||||||
|
my_quad_tree tree;
|
||||||
|
tree.insert (db::DBox (-1, -2, 3, 4));
|
||||||
|
tree.insert (db::DBox (-1, -3, 3, 0));
|
||||||
|
tree.insert (db::DBox (-1, -3, -0.5, -2));
|
||||||
|
tree.insert (db::DBox (-1, -3, -0.5, 2));
|
||||||
|
EXPECT_EQ (tree.levels (), size_t (2));
|
||||||
|
tree.insert (db::DBox (-100, -3, -99, -1));
|
||||||
|
EXPECT_EQ (tree.levels (), size_t (8));
|
||||||
|
|
||||||
|
EXPECT_EQ (tree.check (), true);
|
||||||
|
EXPECT_EQ (find_all (tree), "(-1,-2;3,4)/(-1,-3;-0.5,-2)/(-1,-3;-0.5,2)/(-1,-3;3,0)/(-100,-3;-99,-1)");
|
||||||
|
EXPECT_EQ (find_overlapping (tree, db::DBox (-100, -100, -90, 100)), "(-100,-3;-99,-1)");
|
||||||
|
|
||||||
|
bool r = true;
|
||||||
|
while (r && ! tree.empty ()) {
|
||||||
|
r = tree.erase (*tree.begin ());
|
||||||
|
EXPECT_EQ (r, true);
|
||||||
|
EXPECT_EQ (tree.check (), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_EQ (tree.size (), size_t (0));
|
||||||
|
EXPECT_EQ (tree.levels (), size_t (1));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(clear)
|
TEST(clear)
|
||||||
{
|
{
|
||||||
my_quad_tree tree;
|
my_quad_tree tree;
|
||||||
|
|
@ -391,3 +445,33 @@ TEST(move_ctor)
|
||||||
EXPECT_EQ (tree2.levels (), size_t (2));
|
EXPECT_EQ (tree2.levels (), size_t (2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static double rvalue ()
|
||||||
|
{
|
||||||
|
return ((rand () % 1000000) - 5000) * 0.001;
|
||||||
|
}
|
||||||
|
|
||||||
|
static db::DBox rbox ()
|
||||||
|
{
|
||||||
|
return db::DBox (db::DPoint (rvalue (), rvalue ()), db::DPoint (rvalue (), rvalue ()));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(many)
|
||||||
|
{
|
||||||
|
return; // @@@
|
||||||
|
my_quad_tree tree;
|
||||||
|
|
||||||
|
unsigned int n = 1000;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < n; ++i) {
|
||||||
|
tree.insert (rbox ());
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_EQ (tree.check (), true);
|
||||||
|
|
||||||
|
bool r = true;
|
||||||
|
while (r && ! tree.empty ()) {
|
||||||
|
r = tree.erase (*tree.begin ());
|
||||||
|
EXPECT_EQ (r, true);
|
||||||
|
EXPECT_EQ (tree.check (), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue