From b7a2926f1fb2c1f6a21150e52dc429c8e6db8d90 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 29 Aug 2024 21:48:56 +0200 Subject: [PATCH] More tests for area collector, debugging --- src/db/db/dbAreaCollector.h | 23 ++++--- src/db/unit_tests/dbAreaCollectorTests.cc | 82 ++++++++++++++++++++++- 2 files changed, 95 insertions(+), 10 deletions(-) diff --git a/src/db/db/dbAreaCollector.h b/src/db/db/dbAreaCollector.h index a64c338e8..d650a3378 100644 --- a/src/db/db/dbAreaCollector.h +++ b/src/db/db/dbAreaCollector.h @@ -126,7 +126,7 @@ public: * @brief Constructor */ tagged_area_collector (const tl::bit_set_map &bsm, tagged_area_receiver &receiver) - : mp_bsm (&bsm), mp_receiver (&receiver) + : mp_bsm (&bsm), mp_receiver (&receiver), m_state_one_bits (0), m_prev_one_bits (0) { // .. nothing yet .. } @@ -136,11 +136,14 @@ public: { m_prev = tl::BitSet (); m_state = tl::BitSet (); + m_state_one_bits = 0; + m_prev_one_bits = 0; } virtual void begin_group () { m_prev = m_state; + m_prev_one_bits = m_state_one_bits; } virtual int edge (bool north, bool enter, property_type p) @@ -155,12 +158,14 @@ public: if (enter) { if (count == 0) { m_state.set (p); + ++m_state_one_bits; } ++count; } else { --count; if (count == 0) { m_state.reset (p); + --m_state_one_bits; } } @@ -174,12 +179,7 @@ public: virtual bool is_reset () const { - for (auto i = m_counts.begin (); i != m_counts.end (); ++i) { - if (*i) { - return false; - } - } - return true; + return m_state_one_bits == 0; } virtual bool prefer_touch () const @@ -209,8 +209,12 @@ public: virtual void put (const db::Edge &edge) { area_type partial_area = area_type (edge.p1 ().x () + edge.p2 ().x ()) * area_type (edge.dy ()) * 0.5; - mp_bsm->lookup (m_prev, tagged_area_inserter (partial_area, mp_receiver)); - mp_bsm->lookup (m_state, tagged_area_inserter (-partial_area, mp_receiver)); + if (m_prev_one_bits > 0) { + mp_bsm->lookup (m_prev, tagged_area_inserter (partial_area, mp_receiver)); + } + if (m_state_one_bits > 0) { + mp_bsm->lookup (m_state, tagged_area_inserter (-partial_area, mp_receiver)); + } } private: @@ -219,6 +223,7 @@ private: tagged_area_receiver *mp_receiver; tl::BitSet m_prev, m_state; std::vector m_counts; + unsigned int m_state_one_bits, m_prev_one_bits; }; } diff --git a/src/db/unit_tests/dbAreaCollectorTests.cc b/src/db/unit_tests/dbAreaCollectorTests.cc index 96cdcff11..dd181912d 100644 --- a/src/db/unit_tests/dbAreaCollectorTests.cc +++ b/src/db/unit_tests/dbAreaCollectorTests.cc @@ -49,7 +49,7 @@ private: } -TEST(1) +TEST(1_Basic) { db::EdgeProcessor ep; @@ -74,3 +74,83 @@ TEST(1) EXPECT_EQ (rec.get (), 4500000); } + +TEST(2_ShapesGetMerged) +{ + db::EdgeProcessor ep; + + ep.insert (db::SimplePolygon (db::Box (0, -1000, 1000, 1000)), 0); + ep.insert (db::SimplePolygon (db::Box (0, 0, 1000, 2000)), 0); + ep.insert (db::SimplePolygon (db::Box (500, 1000, 1500, 3000)), 1); + ep.insert (db::SimplePolygon (db::Box (0, 0, 1000, 2000)), 0); + ep.insert (db::SimplePolygon (db::Box (1000, 1000, 1500, 3000)), 1); + + // set up an XOR mask where 1-vs-0 is counted twice + tl::bit_set_map bsm; + tl::BitSetMask bs0; + bs0.set (0, tl::BitSetMask::True); + bs0.set (1, tl::BitSetMask::False); + tl::BitSetMask bs1; + bs1.set (0, tl::BitSetMask::False); + bs1.set (1, tl::BitSetMask::True); + bsm.insert (bs0, 1.0); + bsm.insert (bs1, 2.0); + bsm.sort (); + + AreaReceiver rec; + db::tagged_area_collector coll (bsm, rec); + ep.process (coll, coll); + + EXPECT_EQ (rec.get (), 5500000); +} + +TEST(3_TouchingOnly) +{ + db::EdgeProcessor ep; + + ep.insert (db::SimplePolygon (db::Box (0, -1000, 1000, 1000)), 0); + ep.insert (db::SimplePolygon (db::Box (1000, 0, 2000, 2000)), 1); + ep.insert (db::SimplePolygon (db::Box (1000, 500, 1500, 1500)), 1); + ep.insert (db::SimplePolygon (db::Box (0, 0, 1000, 1000)), 0); + ep.insert (db::SimplePolygon (db::Box (1500, 500, 2000, 2000)), 1); + + // set up an XOR mask where 1-vs-0 is counted twice + tl::bit_set_map bsm; + tl::BitSetMask bs0; + bs0.set (0, tl::BitSetMask::True); + bs0.set (1, tl::BitSetMask::False); + tl::BitSetMask bs1; + bs1.set (0, tl::BitSetMask::False); + bs1.set (1, tl::BitSetMask::True); + bsm.insert (bs0, 1.0); + bsm.insert (bs1, 2.0); + bsm.sort (); + + AreaReceiver rec; + db::tagged_area_collector coll (bsm, rec); + ep.process (coll, coll); + + EXPECT_EQ (rec.get (), 6000000); +} + +TEST(4_PlainAreaApproximation) +{ + db::EdgeProcessor ep; + + ep.insert (db::SimplePolygon (db::Box (0, -1000, 1000, 1000)), 0); + ep.insert (db::SimplePolygon (db::Box (0, 0, 1000, 2000)), 0); + ep.insert (db::SimplePolygon (db::Box (500, 1000, 1500, 3000)), 1); + ep.insert (db::SimplePolygon (db::Box (0, 0, 1000, 2000)), 0); + ep.insert (db::SimplePolygon (db::Box (1000, 1000, 1500, 3000)), 1); + + tl::bit_set_map bsm; + bsm.insert (tl::BitSetMask (), 1.0); + bsm.sort (); + + AreaReceiver rec; + db::tagged_area_collector coll (bsm, rec); + ep.process (coll, coll); + + EXPECT_EQ (rec.get (), 4500000); +} +