WIP: some performance enhancement, but not compatible

This commit is contained in:
Matthias Koefferlein 2023-05-21 20:02:46 +02:00
parent 0400261641
commit ca05f59168
1 changed files with 70 additions and 61 deletions

View File

@ -1352,10 +1352,9 @@ public:
static void
get_intersections_per_band_any (std::vector <CutPoints> &cutpoints, std::vector <WorkEdge>::iterator current, std::vector <WorkEdge>::iterator future, db::Coord y, db::Coord yy, bool with_h)
{
std::vector <WorkEdge *> p1_weak; // holds weak interactions of edge endpoints with other edges
std::vector <WorkEdge *> ip_weak;
double dy = y - 0.5;
double dyy = yy + 0.5;
std::vector <std::pair<const WorkEdge *, WorkEdge *> > p1_weak; // holds weak interactions of edge endpoints with other edges
std::sort (current, future, edge_xmin_at_yinterval_double_compare<db::Coord> (dy, dyy));
@ -1407,9 +1406,10 @@ get_intersections_per_band_any (std::vector <CutPoints> &cutpoints, std::vector
db::Box cell (x, y, xx, yy);
for (std::vector <WorkEdge>::iterator c1 = c; c1 != f; ++c1) {
std::map<db::Point, std::set<const WorkEdge *> > weak_points; // holds points that need to go in all other edges except to ones listed in the value
p1_weak.clear ();
p1_weak.clear ();
for (std::vector <WorkEdge>::iterator c1 = c; c1 != f; ++c1) {
bool c1p1_in_cell = cell.contains (c1->p1 ());
bool c1p2_in_cell = cell.contains (c1->p2 ());
@ -1454,19 +1454,10 @@ get_intersections_per_band_any (std::vector <CutPoints> &cutpoints, std::vector
}
#endif
// The new cutpoint must be inserted into other edges as well.
ip_weak.clear ();
for (std::vector <WorkEdge>::iterator cc = c; cc != f; ++cc) {
if ((with_h || cc->dy () != 0) && cc != c1 && cc != c2 && is_point_on_fuzzy (*cc, cp.second)) {
ip_weak.push_back (&*cc);
}
}
for (std::vector <WorkEdge *>::iterator icc = ip_weak.begin (); icc != ip_weak.end (); ++icc) {
(*icc)->make_cutpoints (cutpoints)->add (cp.second, &cutpoints, true);
#ifdef DEBUG_EDGE_PROCESSOR
printf ("intersection point %s gives cutpoint in %s.\n", cp.second.to_string ().c_str (), (*icc)->to_string ().c_str ());
#endif
}
// Stash the cutpoint as it must be inserted into other edges as well.
std::set<const WorkEdge *> &except = weak_points[cp.second];
except.insert (c1.operator-> ());
except.insert (c2.operator-> ());
}
@ -1509,7 +1500,7 @@ get_intersections_per_band_any (std::vector <CutPoints> &cutpoints, std::vector
std::pair <bool, db::Point> cp = safe_intersect_point (*c1, *c2);
if (cp.first && cell.contains (cp.second)) {
bool on_edge1 = true;
bool on_edge2 = is_point_on_exact (*c2, cp.second);
@ -1523,25 +1514,16 @@ get_intersections_per_band_any (std::vector <CutPoints> &cutpoints, std::vector
#ifdef DEBUG_EDGE_PROCESSOR
if (!on_edge1 || !on_edge2) {
printf ("intersection point %s between %s and %s.\n", cp.second.to_string ().c_str (), c1->to_string ().c_str (), c2->to_string ().c_str ());
printf ("intersection point %s between %s and %s.\n", cp.second.to_string ().c_str (), c1->to_string ().c_str (), c2->to_string ().c_str ());
} else {
printf ("weak intersection point %s between %s and %s.\n", cp.second.to_string ().c_str (), c1->to_string ().c_str (), c2->to_string ().c_str ());
printf ("weak intersection point %s between %s and %s.\n", cp.second.to_string ().c_str (), c1->to_string ().c_str (), c2->to_string ().c_str ());
}
#endif
// The new cutpoint must be inserted into other edges as well.
ip_weak.clear ();
for (std::vector <WorkEdge>::iterator cc = c; cc != f; ++cc) {
if ((with_h || cc->dy () != 0) && cc != c1 && cc != c2 && is_point_on_fuzzy (*cc, cp.second)) {
ip_weak.push_back (&*cc);
}
}
for (std::vector <WorkEdge *>::iterator icc = ip_weak.begin (); icc != ip_weak.end (); ++icc) {
(*icc)->make_cutpoints (cutpoints)->add (cp.second, &cutpoints, true);
#ifdef DEBUG_EDGE_PROCESSOR
printf ("intersection point %s gives cutpoint in %s.\n", cp.second.to_string ().c_str (), (*icc)->to_string ().c_str ());
#endif
}
// Stash the cutpoint as it must be inserted into other edges as well.
std::set<const WorkEdge *> &except = weak_points[cp.second];
except.insert (c1.operator-> ());
except.insert (c2.operator-> ());
}
@ -1562,7 +1544,7 @@ get_intersections_per_band_any (std::vector <CutPoints> &cutpoints, std::vector
#endif
c2->make_cutpoints (cutpoints)->add (c1->p1 (), &cutpoints, true);
} else {
p1_weak.push_back (&*c2);
p1_weak.push_back (std::make_pair (c1.operator-> (), c2.operator-> ()));
}
}
@ -1570,39 +1552,66 @@ get_intersections_per_band_any (std::vector <CutPoints> &cutpoints, std::vector
}
if (! p1_weak.empty ()) {
}
bool strong = false;
for (std::vector<WorkEdge *>::const_iterator cp = p1_weak.begin (); cp != p1_weak.end () && ! strong; ++cp) {
if ((*cp)->data > 0 && cutpoints [(*cp)->data - 1].strong_cutpoints) {
strong = true;
}
// insert weak intersection points into all relevant edges - weak into edges
// where the point is on and strong into edges where the point is on in a fuzzy way.
for (auto wp = weak_points.begin (); wp != weak_points.end (); ++wp) {
for (std::vector <WorkEdge>::iterator cc = c; cc != f; ++cc) {
if ((with_h || cc->dy () != 0) && wp->second.find (cc.operator->()) == wp->second.end () && is_point_on_fuzzy (*cc, wp->first)) {
cc->make_cutpoints (cutpoints)->add (wp->first, &cutpoints, true);
#ifdef DEBUG_EDGE_PROCESSOR
printf ("intersection point %s gives strong cutpoint in %s.\n", wp->first.to_string ().c_str (), cc->to_string ().c_str ());
#endif
}
}
}
// go through the list of "p1 to other edges" and insert p1 either as cutpoint
// (if there are other strong cutpoints already) or weak attractor.
auto p1w_from = p1_weak.begin ();
while (p1w_from != p1_weak.end ()) {
bool strong = false;
auto p1w_to = p1w_from;
while (p1w_to != p1_weak.end () && p1w_to->first == p1w_from->first) {
if (p1w_to->second->data > 0 && cutpoints [p1w_to->second->data - 1].strong_cutpoints) {
strong = true;
}
++p1w_to;
}
db::Point p1 = p1w_from->first->p1 ();
p1w_to [-1].second->make_cutpoints (cutpoints);
size_t n = p1w_to [-1].second->data - 1;
for (auto cp = p1w_from; cp != p1w_to; ++cp) {
cp->second->make_cutpoints (cutpoints);
size_t nn = cp->second->data - 1;
if (strong) {
cutpoints [nn].add (p1, &cutpoints);
#ifdef DEBUG_EDGE_PROCESSOR
printf ("Insert strong attractor %s in %s.\n", cp->first->p1 ().to_string ().c_str (), cp->second->to_string ().c_str ());
#endif
} else {
cutpoints [nn].add_attractor (p1, n);
#ifdef DEBUG_EDGE_PROCESSOR
printf ("Insert weak attractor %s in %s.\n", cp->first->p1 ().to_string ().c_str (), cp->second->to_string ().c_str ());
#endif
}
p1_weak.back ()->make_cutpoints (cutpoints);
size_t n = p1_weak.back ()->data - 1;
for (std::vector<WorkEdge *>::const_iterator cp = p1_weak.begin (); cp != p1_weak.end (); ++cp) {
(*cp)->make_cutpoints (cutpoints);
size_t nn = (*cp)->data - 1;
if (strong) {
cutpoints [nn].add (c1->p1 (), &cutpoints);
#ifdef DEBUG_EDGE_PROCESSOR
printf ("Insert strong attractor %s in %s.\n", c1->p1 ().to_string ().c_str (), (*cp)->to_string ().c_str ());
#endif
} else {
cutpoints [nn].add_attractor (c1->p1 (), n);
#ifdef DEBUG_EDGE_PROCESSOR
printf ("Insert weak attractor %s in %s.\n", c1->p1 ().to_string ().c_str (), (*cp)->to_string ().c_str ());
#endif
}
n = nn;
}
n = nn;
}
p1w_from = p1w_to;
}
}