diff --git a/src/db/db/dbHierNetworkProcessor.cc b/src/db/db/dbHierNetworkProcessor.cc index bd48e5800..ac1b9e06b 100644 --- a/src/db/db/dbHierNetworkProcessor.cc +++ b/src/db/db/dbHierNetworkProcessor.cc @@ -132,6 +132,15 @@ local_cluster::local_cluster () // .. nothing yet .. } +template +void +local_cluster::clear () +{ + m_shapes.clear (); + m_needs_update = false; + m_bbox = box_type (); +} + template void local_cluster::add (const T &s, unsigned int la) @@ -241,7 +250,7 @@ local_cluster::interacts (const local_cluster &other, const db::ICplxTrans { const_cast *> (this)->ensure_sorted (); - if (! other.bbox ().overlaps (bbox ())) { + if (! other.bbox ().touches (bbox ())) { return false; } @@ -253,7 +262,7 @@ local_cluster::interacts (const local_cluster &other, const db::ICplxTrans bool any = false; for (typename std::map::const_iterator s = m_shapes.begin (); s != m_shapes.end (); ++s) { - for (typename tree_type::overlapping_iterator i = s->second.begin_overlapping (common, bc); ! i.at_end (); ++i) { + for (typename tree_type::touching_iterator i = s->second.begin_touching (common, bc); ! i.at_end (); ++i) { scanner.insert1 (i.operator-> (), s->first); any = true; } @@ -264,13 +273,13 @@ local_cluster::interacts (const local_cluster &other, const db::ICplxTrans } for (typename std::map::const_iterator s = other.m_shapes.begin (); s != other.m_shapes.end (); ++s) { - for (typename tree_type::overlapping_iterator i = s->second.begin_overlapping (common.transformed (trans.inverted ()), bc); ! i.at_end (); ++i) { + for (typename tree_type::touching_iterator i = s->second.begin_touching (common.transformed (trans.inverted ()), bc); ! i.at_end (); ++i) { scanner.insert2 (i.operator-> (), s->first); } } interaction_receiver rec (conn, trans); - return ! scanner.process (rec, 0, bc, bc_t); + return ! scanner.process (rec, 1 /*==touching*/, bc, bc_t); } // explicit instantiations diff --git a/src/db/db/dbHierNetworkProcessor.h b/src/db/db/dbHierNetworkProcessor.h index 80e53a1cd..699a41d0c 100644 --- a/src/db/db/dbHierNetworkProcessor.h +++ b/src/db/db/dbHierNetworkProcessor.h @@ -125,6 +125,11 @@ public: */ local_cluster (); + /** + * @brief Clears the cluster + */ + void clear (); + /** * @brief Adds a shape with the given layer to the cluster */ diff --git a/src/db/unit_tests/dbHierNetworkProcessorTests.cc b/src/db/unit_tests/dbHierNetworkProcessorTests.cc index 23176b8fd..f12581415 100644 --- a/src/db/unit_tests/dbHierNetworkProcessorTests.cc +++ b/src/db/unit_tests/dbHierNetworkProcessorTests.cc @@ -133,3 +133,97 @@ TEST(2_ShapeInteractionsRealPolygon) EXPECT_EQ (conn.interacts (ref1, 1, ref2, 2), false); EXPECT_EQ (conn.interacts (ref1, 1, ref1, 2, t2), false); } + +TEST(10_LocalClusterBasic) +{ + db::GenericRepository repo; + + db::Polygon poly; + tl::from_string ("(0,0;0,1000;1000,1000;1000,0)", poly); + + db::local_cluster cluster; + EXPECT_EQ (cluster.bbox ().to_string (), "()"); + EXPECT_EQ (cluster.id (), size_t (0)); + + cluster.add (db::PolygonRef (poly, repo), 0); + EXPECT_EQ (cluster.bbox ().to_string (), "(0,0;1000,1000)"); + + db::local_cluster cluster2; + cluster.add (db::PolygonRef (poly, repo).transformed (db::Trans (db::Vector (10, 20))), 1); + + cluster.join_with (cluster2); + EXPECT_EQ (cluster.bbox ().to_string (), "(0,0;1010,1020)"); +} + +TEST(11_LocalClusterInteractBasic) +{ + db::GenericRepository repo; + + db::Connectivity conn; + conn.connect (0); + conn.connect (1); + conn.connect (2); + conn.connect (0, 1); + conn.connect (0, 2); + + db::Polygon poly; + tl::from_string ("(0,0;0,1000;1000,1000;1000,0)", poly); + + db::local_cluster cluster; + db::local_cluster cluster2; + + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), false); + + cluster.add (db::PolygonRef (poly, repo), 0); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), false); + + cluster2.add (db::PolygonRef (poly, repo), 0); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), true); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (db::Trans (db::Vector (10, 20))), conn), true); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (db::Trans (db::Vector (0, 1000))), conn), true); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (db::Trans (db::Vector (0, 1001))), conn), false); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (db::Trans (db::Vector (0, 2000))), conn), false); + + cluster.clear (); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), false); +} + +TEST(11_LocalClusterInteractDifferentLayers) +{ + db::GenericRepository repo; + + db::Connectivity conn; + conn.connect (0); + conn.connect (1); + conn.connect (2); + conn.connect (0, 1); + conn.connect (0, 2); + + db::Polygon poly; + tl::from_string ("(0,0;0,1000;1000,1000;1000,0)", poly); + + db::local_cluster cluster; + db::local_cluster cluster2; + + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), false); + + cluster.add (db::PolygonRef (poly, repo), 0); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), false); + + cluster2.add (db::PolygonRef (poly, repo), 1); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), true); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (db::Trans (db::Vector (10, 20))), conn), true); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (db::Trans (db::Vector (0, 1000))), conn), true); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (db::Trans (db::Vector (0, 1001))), conn), false); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (db::Trans (db::Vector (0, 2000))), conn), false); + + cluster.clear (); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), false); + cluster.add (db::PolygonRef (poly, repo), 2); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), false); // not connected + + cluster.clear (); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), false); + cluster.add (db::PolygonRef (poly, repo), 1); + EXPECT_EQ (cluster.interacts (cluster2, db::ICplxTrans (), conn), true); +}