From aba912107bff5722cb2fb3af5bf6fe133e836199 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 24 May 2025 00:09:52 +0200 Subject: [PATCH] Refined solution, so it would allow a larger coordinate range. --- src/db/db/dbEdgesUtils.cc | 8 +++++--- src/db/unit_tests/dbEdgesTests.cc | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/db/db/dbEdgesUtils.cc b/src/db/db/dbEdgesUtils.cc index 382c378bd..68db12206 100644 --- a/src/db/db/dbEdgesUtils.cc +++ b/src/db/db/dbEdgesUtils.cc @@ -306,12 +306,14 @@ EdgeOrientationFilter::EdgeOrientationFilter (double a, bool inverse, bool absol bool EdgeOrientationFilter::selected (const db::Edge &edge, db::properties_id_type) const { + db::Vector en = db::Vector (std::max (edge.dx_abs (), edge.dy_abs ()), 0); + // NOTE: this edge normalization confines the angle to a range between (-90 .. 90] (-90 excluded). // A horizontal edge has 0 degree, a vertical one has 90 degree. if (edge.dx () < 0 || (edge.dx () == 0 && edge.dy () < 0)) { - return m_checker (db::Vector (edge.ortho_length (), 0), -edge.d ()); + return m_checker (en, -edge.d ()); } else { - return m_checker (db::Vector (edge.ortho_length (), 0), edge.d ()); + return m_checker (en, edge.d ()); } } @@ -363,7 +365,7 @@ SpecialEdgeOrientationFilter::selected (const db::Edge &edge, properties_id_type } db::Vector en, ev; - en = db::Vector (edge.ortho_length (), 0); + en = db::Vector (std::max (edge.dx_abs (), edge.dy_abs ()), 0); // NOTE: this edge normalization confines the angle to a range between (-90 .. 90] (-90 excluded). // A horizontal edge has 0 degree, a vertical one has 90 degree. diff --git a/src/db/unit_tests/dbEdgesTests.cc b/src/db/unit_tests/dbEdgesTests.cc index 662aceb7b..2c20bf043 100644 --- a/src/db/unit_tests/dbEdgesTests.cc +++ b/src/db/unit_tests/dbEdgesTests.cc @@ -265,6 +265,9 @@ TEST(4) // issue-2060 { db::EdgeOrientationFilter f1 (90.0, true, false); + db::EdgeOrientationFilter f2 (90.0, false, false); + db::EdgeOrientationFilter f45 (45.0, false, false); + db::SpecialEdgeOrientationFilter fs (db::SpecialEdgeOrientationFilter::Diagonal, false); db::Edges rr; rr.insert (db::Box (db::Point (0, 0), db::Point (1000, 4000000))); @@ -273,6 +276,21 @@ TEST(4) rr.clear (); rr.insert (db::Box (db::Point (0, 0), db::Point (1000, 400000))); EXPECT_EQ (db::compare (rr.filtered (f1), "(1000,0;0,0);(0,400000;1000,400000)"), true); + + rr.clear (); + rr.insert (db::Box (db::Point (0, -1000000000), db::Point (1000, 1000000000))); + EXPECT_EQ (db::compare (rr.filtered (f1), "(1000,-1000000000;0,-1000000000);(0,1000000000;1000,1000000000)"), true); + + rr.clear (); + rr.insert (db::Box (db::Point (0, -1000000000), db::Point (1000, 1000000000))); + EXPECT_EQ (db::compare (rr.filtered (f2), "(0,-1000000000;0,1000000000);(1000,1000000000;1000,-1000000000)"), true); + + EXPECT_EQ (f2.selected (db::Edge (db::Point (0, -1000000000), db::Point (0, 1000000000)), size_t (0)), true); + EXPECT_EQ (f2.selected (db::Edge (db::Point (0, -1000000000), db::Point (1, 1000000000)), size_t (0)), false); + EXPECT_EQ (f45.selected (db::Edge (db::Point (-1000000000, -1000000000), db::Point (1000000000, 1000000000)), size_t (0)), true); + EXPECT_EQ (f45.selected (db::Edge (db::Point (-1000000000, -1000000000), db::Point (1000000000, 1000000001)), size_t (0)), false); + EXPECT_EQ (fs.selected (db::Edge (db::Point (-1000000000, -1000000000), db::Point (1000000000, 1000000000)), size_t (0)), true); + EXPECT_EQ (fs.selected (db::Edge (db::Point (-1000000000, -1000000000), db::Point (1000000000, 1000000001)), size_t (0)), false); } }