From 23c2ae73060339ecb095b17127c257d5cb8e2f42 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 30 Jan 2018 00:40:17 +0100 Subject: [PATCH] Fixed #69 (DRC: 'inside' does not merge shapes of second input) --- src/db/db/dbEdgeProcessor.h | 3 +- src/db/db/dbRegion.h | 4 +- src/db/unit_tests/dbRegion.cc | 101 ++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 3 deletions(-) diff --git a/src/db/db/dbEdgeProcessor.h b/src/db/db/dbEdgeProcessor.h index 6568a7df6..7170e1b19 100644 --- a/src/db/db/dbEdgeProcessor.h +++ b/src/db/db/dbEdgeProcessor.h @@ -255,6 +255,7 @@ public: * * If this flag is set, the interaction will include "touching" interactions in mode 0, i.e. * touching shapes will be counted as interacting. + * In the other modes, this flag should be true (the default). */ void set_include_touching (bool f) { @@ -299,7 +300,7 @@ public: virtual int edge (bool north, bool enter, property_type p); virtual int compare_ns () const; virtual bool is_reset () const { return m_inside.empty (); } - virtual bool prefer_touch () const { return m_mode == 0 && m_include_touching; } + virtual bool prefer_touch () const { return m_include_touching; } private: int m_mode; diff --git a/src/db/db/dbRegion.h b/src/db/db/dbRegion.h index 9aa4dae3b..80e4b08de 100644 --- a/src/db/db/dbRegion.h +++ b/src/db/db/dbRegion.h @@ -1273,7 +1273,7 @@ public: */ Region selected_inside (const Region &other) const { - return selected_interacting_generic (other, -1, false, false); + return selected_interacting_generic (other, -1, true, false); } /** @@ -1285,7 +1285,7 @@ public: */ Region selected_not_inside (const Region &other) const { - return selected_interacting_generic (other, -1, false, true); + return selected_interacting_generic (other, -1, true, true); } /** diff --git a/src/db/unit_tests/dbRegion.cc b/src/db/unit_tests/dbRegion.cc index 8700ece97..c1eb0271b 100644 --- a/src/db/unit_tests/dbRegion.cc +++ b/src/db/unit_tests/dbRegion.cc @@ -748,6 +748,107 @@ TEST(18b) } } +TEST(18c) +{ + // GitHub issue #69 + + db::Region r; + r.insert (db::Box (db::Point (-120, 0), db::Point (-100, 20))); + r.insert (db::Box (db::Point (-20, 0), db::Point (0, 20))); + r.insert (db::Box (db::Point (0, 0), db::Point (20, 20))); + r.insert (db::Box (db::Point (100, 0), db::Point (120, 20))); + + db::Region rr; + rr.insert (db::Box (db::Point (-100, -10), db::Point (0, 30))); + rr.insert (db::Box (db::Point (0, -10), db::Point (100, 30))); + + EXPECT_EQ (r.selected_outside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_inside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_overlapping (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_interacting (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(-20,0;-20,20;20,20;20,0);(100,0;100,20;120,20;120,0)"); + + EXPECT_EQ (r.selected_not_outside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_not_inside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_not_overlapping (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_not_interacting (rr).to_string (), ""); + + r.clear (); + r.insert (db::Box (db::Point (-120, 0), db::Point (-100, 20))); + r.insert (db::Box (db::Point (-20, 0), db::Point (20, 20))); + r.insert (db::Box (db::Point (100, 0), db::Point (120, 20))); + + rr.clear (); + rr.insert (db::Box (db::Point (-100, -10), db::Point (0, 30))); + rr.insert (db::Box (db::Point (0, -10), db::Point (100, 30))); + + EXPECT_EQ (r.selected_outside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_inside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_overlapping (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_interacting (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(-20,0;-20,20;20,20;20,0);(100,0;100,20;120,20;120,0)"); + + EXPECT_EQ (r.selected_not_outside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_not_inside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_not_overlapping (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_not_interacting (rr).to_string (), ""); + + r.clear (); + r.insert (db::Box (db::Point (-120, 0), db::Point (-100, 20))); + r.insert (db::Box (db::Point (-20, 0), db::Point (20, 20))); + r.insert (db::Box (db::Point (100, 0), db::Point (120, 20))); + + rr.clear (); + rr.insert (db::Box (db::Point (-100, -10), db::Point (100, 30))); + + EXPECT_EQ (r.selected_outside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_inside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_overlapping (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_interacting (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(-20,0;-20,20;20,20;20,0);(100,0;100,20;120,20;120,0)"); + + EXPECT_EQ (r.selected_not_outside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_not_inside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_not_overlapping (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_not_interacting (rr).to_string (), ""); + + r.clear (); + r.insert (db::Box (db::Point (-120, 0), db::Point (-100, 20))); + r.insert (db::Box (db::Point (-20, 0), db::Point (20, 20))); + r.insert (db::Box (db::Point (100, 0), db::Point (120, 20))); + + rr.clear (); + rr.insert (db::Box (db::Point (-100, -10), db::Point (0, 30))); + rr.insert (db::Box (db::Point (1, -10), db::Point (100, 30))); + + EXPECT_EQ (r.selected_outside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_inside (rr).to_string (), ""); + EXPECT_EQ (r.selected_overlapping (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_interacting (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(-20,0;-20,20;20,20;20,0);(100,0;100,20;120,20;120,0)"); + + EXPECT_EQ (r.selected_not_outside (rr).to_string (), "(-20,0;-20,20;20,20;20,0)"); + EXPECT_EQ (r.selected_not_inside (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(-20,0;-20,20;20,20;20,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_not_overlapping (rr).to_string (), "(-120,0;-120,20;-100,20;-100,0);(100,0;100,20;120,20;120,0)"); + EXPECT_EQ (r.selected_not_interacting (rr).to_string (), ""); + + r.clear (); + r.insert (db::Box (db::Point (-100, 0), db::Point (-80, 20))); + r.insert (db::Box (db::Point (-20, 0), db::Point (0, 20))); + r.insert (db::Box (db::Point (0, 0), db::Point (20, 20))); + r.insert (db::Box (db::Point (80, 0), db::Point (100, 20))); + + rr.clear (); + rr.insert (db::Box (db::Point (-100, -10), db::Point (0, 30))); + rr.insert (db::Box (db::Point (0, -10), db::Point (100, 30))); + + EXPECT_EQ (r.selected_outside (rr).to_string (), ""); + EXPECT_EQ (r.selected_inside (rr).to_string (), "(-100,0;-100,20;-80,20;-80,0);(-20,0;-20,20;20,20;20,0);(80,0;80,20;100,20;100,0)"); + EXPECT_EQ (r.selected_overlapping (rr).to_string (), "(-100,0;-100,20;-80,20;-80,0);(-20,0;-20,20;20,20;20,0);(80,0;80,20;100,20;100,0)"); + EXPECT_EQ (r.selected_interacting (rr).to_string (), "(-100,0;-100,20;-80,20;-80,0);(-20,0;-20,20;20,20;20,0);(80,0;80,20;100,20;100,0)"); + + EXPECT_EQ (r.selected_not_outside (rr).to_string (), "(-100,0;-100,20;-80,20;-80,0);(-20,0;-20,20;20,20;20,0);(80,0;80,20;100,20;100,0)"); + EXPECT_EQ (r.selected_not_inside (rr).to_string (), ""); + EXPECT_EQ (r.selected_not_overlapping (rr).to_string (), ""); + EXPECT_EQ (r.selected_not_interacting (rr).to_string (), ""); +} + TEST(19) { db::Region r1;