38 lines
2.1 KiB
Diff
38 lines
2.1 KiB
Diff
# UNDF: UNDF-2026-000001073
|
|
# UNDF: (leave blank — assigned later)
|
|
--- a/src/PathOrderMonotonic.cpp
|
|
+++ b/src/PathOrderMonotonic.cpp
|
|
@@ -278,6 +278,8 @@ std::vector<typename PathOrderMonotonic<PathType>::Path> PathOrderMonotonic<Path
|
|
std::unordered_set<Path*> starting_lines;
|
|
std::unordered_map<Path*, Path*> connections;
|
|
|
|
+ // Pre-build an index from Path* to its position in polylines for O(1) iterator lookup.
|
|
+ std::unordered_map<Path*, typename std::vector<Path*>::iterator> polyline_index;
|
|
+ for (auto it = polylines.begin(); it != polylines.end(); ++it)
|
|
+ polyline_index[*it] = it;
|
|
+
|
|
for (auto polyline_it = polylines.begin(); polyline_it != polylines.end(); polyline_it++)
|
|
{
|
|
if (connections.contains(*polyline_it))
|
|
@@ -291,15 +295,17 @@ std::vector<typename PathOrderMonotonic<PathType>::Path> PathOrderMonotonic<Path
|
|
if (polystring.size() > 1)
|
|
{
|
|
starting_lines.insert(polystring[0]);
|
|
+ // Build a set of paths in this polystring for O(1) membership checks.
|
|
+ std::unordered_set<Path*> polystring_set(polystring.begin(), polystring.end());
|
|
for (size_t i = 0; i < polystring.size() - 1; ++i)
|
|
{
|
|
connections[polystring[i]] = polystring[i + 1];
|
|
connected_lines.insert(polystring[i + 1]);
|
|
|
|
const std::vector<Path*> overlapping_lines
|
|
- = getOverlappingLines(std::find(polylines.begin(), polylines.end(), polystring[i]), perpendicular, polylines, max_adjacent_distance);
|
|
+ = getOverlappingLines(polyline_index.at(polystring[i]), perpendicular, polylines, max_adjacent_distance);
|
|
for (Path* overlapping_line : overlapping_lines)
|
|
{
|
|
- if (std::find(polystring.begin(), polystring.end(), overlapping_line)
|
|
- == polystring.end())
|
|
+ if (polystring_set.find(overlapping_line) == polystring_set.end())
|
|
{
|
|
starting_lines.insert(overlapping_line);
|
|
starting_lines.insert(polystring[i + 1]);
|