From aa267744dc3fbd10bd5e4727f3e3d46f1034d754 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 29 Aug 2022 22:48:17 +0200 Subject: [PATCH] Exposed more functions for db::Edges, more tests, debugging --- src/db/db/dbAsIfFlatEdges.cc | 1 + src/db/db/dbEdges.h | 47 +++++++++++++++++++++++++++++++ src/db/unit_tests/dbEdgesTests.cc | 26 +++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/src/db/db/dbAsIfFlatEdges.cc b/src/db/db/dbAsIfFlatEdges.cc index da124613c..caf35e5d4 100644 --- a/src/db/db/dbAsIfFlatEdges.cc +++ b/src/db/db/dbAsIfFlatEdges.cc @@ -824,6 +824,7 @@ AsIfFlatEdges::edge_region_op (const Region &other, db::EdgePolygonOp::mode_t mo std::unique_ptr output_second; std::unique_ptr cc_second; if (mode == db::EdgePolygonOp::Both) { + output_second.reset (new FlatEdges (false)); cc_second.reset (new db::EdgeShapeGenerator (output_second->raw_edges (), true /*clear*/, 2 /*second tag*/)); } diff --git a/src/db/db/dbEdges.h b/src/db/db/dbEdges.h index 828649714..f0536af5b 100644 --- a/src/db/db/dbEdges.h +++ b/src/db/db/dbEdges.h @@ -794,6 +794,24 @@ public: return *this; } + /** + * @brief Boolean AND/NOT operator in the same operation + */ + std::pair andnot (const Edges &other) const + { + std::pair p = mp_delegate->andnot_with (other); + return std::pair (Edges (p.first), Edges (p.second)); + } + + /** + * @brief Boolean AND/NOT operator with a region in the same operation + */ + std::pair andnot (const Region &other) const + { + std::pair p = mp_delegate->andnot_with (other); + return std::pair (Edges (p.first), Edges (p.second)); + } + /** * @brief Boolean XOR operator */ @@ -974,6 +992,17 @@ public: return Edges (mp_delegate->outside_part (other)); } + /** + * @brief Returns the eges inside the given region and the ones outside the region. + * + * This method combined both inside_part and outside_part. + */ + std::pair inside_outside_part (const Region &other) const + { + std::pair p = mp_delegate->inside_outside_part_pair (other); + return std::pair (Edges (p.first), Edges (p.second)); + } + /** * @brief Selects all polygons of the other region set which overlap or touch edges from this edge set * @@ -1037,6 +1066,15 @@ public: return Edges (mp_delegate->selected_not_interacting (other)); } + /** + * @brief Returns all edges of this edge set which do not overlap or touch with polygons from the region together with the ones that do not + */ + std::pair selected_interacting_differential (const Region &other) const + { + std::pair p = mp_delegate->selected_interacting_pair (other); + return std::pair (Edges (p.first), Edges (p.second)); + } + /** * @brief Selects all edges of this edge collection which are completely outside polygons from the region * @@ -1295,6 +1333,15 @@ public: return Edges (mp_delegate->selected_interacting (other)); } + /** + * @brief Returns all edges of this edge set which do not overlap or touch with edges from the other edge set together with the ones that do not + */ + std::pair selected_interacting_differential (const Edges &other) const + { + std::pair p = mp_delegate->selected_interacting_pair (other); + return std::pair (Edges (p.first), Edges (p.second)); + } + /** * @brief Selects all edges of this edge set which do not overlap or touch with edges from the other edge set * diff --git a/src/db/unit_tests/dbEdgesTests.cc b/src/db/unit_tests/dbEdgesTests.cc index 52fe0cacc..a3073dc6d 100644 --- a/src/db/unit_tests/dbEdgesTests.cc +++ b/src/db/unit_tests/dbEdgesTests.cc @@ -120,13 +120,16 @@ TEST(2) r2.insert (db::Box (db::Point (0, 10), db::Point (100, 210))); EXPECT_EQ (db::compare ((r & r1), "(10,200;100,200);(100,0;10,0)"), true); + EXPECT_EQ (db::compare (r.andnot(r1).first, "(10,200;100,200);(100,0;10,0)"), true); EXPECT_EQ (db::compare ((r & r2), "(0,10;0,200);(100,200;100,10)"), true); + EXPECT_EQ (db::compare (r.andnot(r2).first, "(0,10;0,200);(100,200;100,10)"), true); db::Edges o1 = r; o1 &= r1; EXPECT_EQ (o1.is_merged (), true); EXPECT_EQ (db::compare (o1, "(10,200;100,200);(100,0;10,0)"), true); EXPECT_EQ (db::compare ((r - r1), "(0,0;0,200);(100,200;100,0);(0,200;10,200);(10,0;0,0)"), true); + EXPECT_EQ (db::compare (r.andnot(r1).second, "(0,0;0,200);(100,200;100,0);(0,200;10,200);(10,0;0,0)"), true); db::Edges o2 = r; o2 -= r1; EXPECT_EQ (o2.is_merged (), true); @@ -392,31 +395,41 @@ TEST(8) e2.insert (db::Edge (db::Point (0, 100), db::Point (100, 100))); EXPECT_EQ (e.selected_interacting (e2).to_string (), "(0,0;0,200)"); + EXPECT_EQ (e.selected_interacting_differential (e2).first.to_string (), "(0,0;0,200)"); EXPECT_EQ (e.selected_not_interacting (e2).to_string (), "(250,200;300,0)"); + EXPECT_EQ (e.selected_interacting_differential (e2).second.to_string (), "(250,200;300,0)"); e2.clear (); e2.insert (db::Edge (db::Point (0, 100), db::Point (0, 100))); EXPECT_EQ (e.selected_interacting (e2).to_string (), "(0,0;0,200)"); + EXPECT_EQ (e.selected_interacting_differential (e2).first.to_string (), "(0,0;0,200)"); EXPECT_EQ (e.selected_not_interacting (e2).to_string (), "(250,200;300,0)"); + EXPECT_EQ (e.selected_interacting_differential (e2).second.to_string (), "(250,200;300,0)"); e2.clear (); e2.insert (db::Edge (db::Point (100, 0), db::Point (0, 0))); EXPECT_EQ (e.selected_interacting (e2).to_string (), "(0,0;0,200)"); + EXPECT_EQ (e.selected_interacting_differential (e2).first.to_string (), "(0,0;0,200)"); EXPECT_EQ (e.selected_not_interacting (e2).to_string (), "(250,200;300,0)"); + EXPECT_EQ (e.selected_interacting_differential (e2).second.to_string (), "(250,200;300,0)"); e2.clear (); e2.insert (db::Edge (db::Point (-100, -1), db::Point (100, -1))); EXPECT_EQ (e.selected_interacting (e2).to_string (), ""); + EXPECT_EQ (e.selected_interacting_differential (e2).first.to_string (), ""); EXPECT_EQ (db::compare (e.selected_not_interacting (e2), "(0,0;0,200);(250,200;300,0)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (e2).second, "(0,0;0,200);(250,200;300,0)"), true); e2.clear (); e2.insert (db::Edge (db::Point (-100, 0), db::Point (100, 0))); EXPECT_EQ (e.selected_interacting (e2).to_string (), "(0,0;0,200)"); + EXPECT_EQ (e.selected_interacting_differential (e2).first.to_string (), "(0,0;0,200)"); EXPECT_EQ (e.selected_not_interacting (e2).to_string (), "(250,200;300,0)"); + EXPECT_EQ (e.selected_interacting_differential (e2).second.to_string (), "(250,200;300,0)"); db::Edges ee = e; e.select_interacting (e2); @@ -785,7 +798,9 @@ TEST(20) EXPECT_EQ (r2.merged ().to_string (100), "(60,10;60,20);(60,20;70,20);(70,20;70,10);(70,10;60,10);(10,10;10,40);(10,40;40,40);(40,40;40,10);(40,10;10,10);(80,40;80,70);(80,70;140,70);(140,70;140,40);(140,40;80,40)"); EXPECT_EQ (rr1.to_string (100), "(0,0;0,30;30,30;30,0);(50,0;50,30;80,30;80,0);(50,40;50,70;80,70;80,40)"); EXPECT_EQ (r2.selected_interacting (rr1).to_string (100), "(60,10;60,20);(60,20;70,20);(70,20;70,10);(70,10;60,10);(10,10;10,40);(40,10;10,10);(80,40;80,70);(80,70;140,70);(140,40;80,40)"); + EXPECT_EQ (r2.selected_interacting_differential (rr1).first.to_string (100), "(60,10;60,20);(60,20;70,20);(70,20;70,10);(70,10;60,10);(10,10;10,40);(40,10;10,10);(80,40;80,70);(80,70;140,70);(140,40;80,40)"); EXPECT_EQ (r2.selected_not_interacting (rr1).to_string (100), "(10,40;40,40);(40,40;40,10);(140,70;140,40)"); + EXPECT_EQ (r2.selected_interacting_differential (rr1).second.to_string (100), "(10,40;40,40);(40,40;40,10);(140,70;140,40)"); db::Edges r2dup = r2; r2.select_interacting (rr1); @@ -809,7 +824,9 @@ TEST(21) db::Edges e, ee; e.insert (db::Edge (-100, 100, 200, 100)); EXPECT_EQ ((e & r).to_string (), "(0,100;100,100)"); + EXPECT_EQ (e.andnot(r).first.to_string (), "(0,100;100,100)"); EXPECT_EQ (e.inside_part (r).to_string (), "(0,100;100,100)"); + EXPECT_EQ (e.inside_outside_part (r).first.to_string (), "(0,100;100,100)"); ee = e; ee &= r; @@ -820,7 +837,9 @@ TEST(21) EXPECT_EQ (ee.to_string (), "(0,100;100,100)"); EXPECT_EQ (db::compare ((e - r), "(-100,100;0,100);(100,100;200,100)"), true); + EXPECT_EQ (db::compare (e.andnot(r).second, "(-100,100;0,100);(100,100;200,100)"), true); EXPECT_EQ (db::compare (e.outside_part (r), "(-100,100;0,100);(100,100;200,100)"), true); + EXPECT_EQ (db::compare (e.inside_outside_part (r).second, "(-100,100;0,100);(100,100;200,100)"), true); ee = e; ee -= r; @@ -833,7 +852,9 @@ TEST(21) e.clear (); e.insert (db::Edge (-100, 0, 200, 0)); EXPECT_EQ ((e & r).to_string (), "(0,0;100,0)"); + EXPECT_EQ (e.andnot(r).first.to_string (), "(0,0;100,0)"); EXPECT_EQ (e.inside_part (r).to_string (), ""); + EXPECT_EQ (e.inside_outside_part (r).first.to_string (), ""); ee = e; ee &= r; @@ -844,6 +865,7 @@ TEST(21) EXPECT_EQ (ee.to_string (), ""); EXPECT_EQ (db::compare ((e - r), "(-100,0;0,0);(100,0;200,0)"), true); + EXPECT_EQ (db::compare (e.andnot(r).second, "(-100,0;0,0);(100,0;200,0)"), true); EXPECT_EQ (db::compare (e.outside_part (r), "(-100,0;0,0);(0,0;100,0);(100,0;200,0)"), true); ee = e; @@ -874,6 +896,7 @@ TEST(22) ee.insert (db::Edge (4000,-2000,-2000,-2000)); EXPECT_EQ (db::compare ((e & ee), "(400,0;-2000,0);(500,-174;400,0);(1000,0;900,-173);(4000,0;1000,0)"), true); + EXPECT_EQ (db::compare (e.andnot(ee).first, "(400,0;-2000,0);(500,-174;400,0);(1000,0;900,-173);(4000,0;1000,0)"), true); EXPECT_EQ (db::compare (e.intersections (ee), "(400,0;-2000,0);(500,-174;400,0);(1000,0;900,-173);(4000,0;1000,0)"), true); // Edge/edge intersections @@ -883,6 +906,7 @@ TEST(22) ee.insert (db::Edge (-50, 50, 50, 50)); ee.insert (db::Edge (-50, 100, 50, 100)); EXPECT_EQ ((e & ee).to_string (), ""); // AND does not report intersection points + EXPECT_EQ (e.andnot(ee).first.to_string (), ""); // AND does not report intersection points EXPECT_EQ (db::compare (e.intersections (ee), "(0,50;0,50);(0,100;0,100)"), true); // Edge is intersected by pair with connection point on this line @@ -894,6 +918,7 @@ TEST(22) ee.insert (db::Edge (-50, 100, 0, 100)); ee.insert (db::Edge (0, 100, 50, 100)); EXPECT_EQ ((e & ee).to_string (), ""); // AND does not report intersection points + EXPECT_EQ (e.andnot(ee).first.to_string (), ""); // AND does not report intersection points EXPECT_EQ (db::compare (e.intersections (ee), "(0,50;0,50);(0,60;0,60);(0,100;0,100)"), true); // Coincident edges are crossed by another one @@ -904,6 +929,7 @@ TEST(22) ee.insert (db::Edge (-50, 100, 50, 100)); ee.insert (db::Edge (-50, 200, 50, 200)); EXPECT_EQ ((e & ee).to_string (), "(0,0;0,150)"); + EXPECT_EQ (e.andnot(ee).first.to_string (), "(0,0;0,150)"); EXPECT_EQ (db::compare (e.intersections (ee), "(0,0;0,150);(0,200;0,200)"), true); }