Refined solution, so it would allow a larger coordinate range.

This commit is contained in:
Matthias Koefferlein 2025-05-24 00:09:52 +02:00
parent 6d28c78eeb
commit aba912107b
2 changed files with 23 additions and 3 deletions

View File

@ -306,12 +306,14 @@ EdgeOrientationFilter::EdgeOrientationFilter (double a, bool inverse, bool absol
bool bool
EdgeOrientationFilter::selected (const db::Edge &edge, db::properties_id_type) const 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). // 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. // A horizontal edge has 0 degree, a vertical one has 90 degree.
if (edge.dx () < 0 || (edge.dx () == 0 && edge.dy () < 0)) { 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 { } 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; 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). // 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. // A horizontal edge has 0 degree, a vertical one has 90 degree.

View File

@ -265,6 +265,9 @@ TEST(4)
// issue-2060 // issue-2060
{ {
db::EdgeOrientationFilter f1 (90.0, true, false); 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; db::Edges rr;
rr.insert (db::Box (db::Point (0, 0), db::Point (1000, 4000000))); rr.insert (db::Box (db::Point (0, 0), db::Point (1000, 4000000)));
@ -273,6 +276,21 @@ TEST(4)
rr.clear (); rr.clear ();
rr.insert (db::Box (db::Point (0, 0), db::Point (1000, 400000))); 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); 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);
} }
} }