From 6d28c78eeb59cd4d63d8e344c81aca8a347862bd Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 22 May 2025 22:48:48 +0200 Subject: [PATCH 1/2] Fixed issue #2060 - the precision of the check was too low. --- src/db/db/dbEdgesUtils.cc | 10 +++++----- src/db/db/dbEdgesUtils.h | 2 +- src/db/unit_tests/dbEdgesTests.cc | 13 +++++++++++++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/db/db/dbEdgesUtils.cc b/src/db/db/dbEdgesUtils.cc index 15dcb5a1b..382c378bd 100644 --- a/src/db/db/dbEdgesUtils.cc +++ b/src/db/db/dbEdgesUtils.cc @@ -250,8 +250,8 @@ EdgeAngleChecker::EdgeAngleChecker (double angle_start, bool include_angle_start include_angle_start = true; } - m_t_start = db::CplxTrans(1.0, angle_start, false, db::DVector ()); - m_t_end = db::CplxTrans(1.0, angle_end, false, db::DVector ()); + m_t_start = db::ICplxTrans (1.0, angle_start, false, db::Vector ()); + m_t_end = db::ICplxTrans (1.0, angle_end, false, db::Vector ()); m_include_start = include_angle_start; m_include_end = include_angle_end; @@ -266,10 +266,10 @@ EdgeAngleChecker::EdgeAngleChecker (double angle_start, bool include_angle_start bool EdgeAngleChecker::check (const db::Vector &a, const db::Vector &b) const { - db::DVector vout (b); + db::Vector vout (b); - db::DVector v1 = m_t_start * a; - db::DVector v2 = m_t_end * a; + db::Vector v1 = m_t_start * a; + db::Vector v2 = m_t_end * a; int vps1 = db::vprod_sign (v1, vout); int vps2 = db::vprod_sign (v2, vout); diff --git a/src/db/db/dbEdgesUtils.h b/src/db/db/dbEdgesUtils.h index d0082806d..769687b01 100644 --- a/src/db/db/dbEdgesUtils.h +++ b/src/db/db/dbEdgesUtils.h @@ -155,7 +155,7 @@ public: } private: - db::CplxTrans m_t_start, m_t_end; + db::ICplxTrans m_t_start, m_t_end; bool m_include_start, m_include_end; bool m_big_angle, m_all; bool m_inverse, m_absolute; diff --git a/src/db/unit_tests/dbEdgesTests.cc b/src/db/unit_tests/dbEdgesTests.cc index 0db2b9676..662aceb7b 100644 --- a/src/db/unit_tests/dbEdgesTests.cc +++ b/src/db/unit_tests/dbEdgesTests.cc @@ -261,6 +261,19 @@ TEST(4) db::EdgeOrientationFilter f1 (89.0, true, 90.0, false, false, false); EXPECT_EQ (r.filtered (f1).to_string (), ""); } + + // issue-2060 + { + db::EdgeOrientationFilter f1 (90.0, true, false); + + db::Edges rr; + rr.insert (db::Box (db::Point (0, 0), db::Point (1000, 4000000))); + EXPECT_EQ (db::compare (rr.filtered (f1), "(1000,0;0,0);(0,4000000;1000,4000000)"), true); + + 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); + } } TEST(5) From aba912107bff5722cb2fb3af5bf6fe133e836199 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 24 May 2025 00:09:52 +0200 Subject: [PATCH 2/2] 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); } }