PNS: Limit the maximum walkaround distance factor

The constant chosen is somewhat arbitrary and may need
further tuning or a more complex algorithm, but in general
this will prevent churning when solutions can't be found or
a solution can be found but it is unrealistic (going around
the entire board)

Fixes https://gitlab.com/kicad/code/kicad/-/issues/8558
This commit is contained in:
Jon Evans 2021-06-06 16:03:03 -04:00
parent d32b9c1c25
commit c9bc45f7ed
1 changed files with 11 additions and 0 deletions

View File

@ -127,6 +127,13 @@ const WALKAROUND::RESULT WALKAROUND::Route( const LINE& aInitialPath )
m_forceSingleDirection = false;
}
// In some situations, there isn't a trivial path (or even a path at all). Hitting the
// iteration limit causes lag, so we can exit out early if the walkaround path gets very long
// compared with the initial path. If the length exceeds the initial length times this factor,
// fail out.
const int maxWalkDistFactor = 10;
long long lengthLimit = aInitialPath.CLine().Length() * maxWalkDistFactor;
while( m_iteration < m_iterationLimit )
{
if( s_cw != STUCK && s_cw != ALMOST_DONE )
@ -150,6 +157,10 @@ const WALKAROUND::RESULT WALKAROUND::Route( const LINE& aInitialPath )
if( s_cw != IN_PROGRESS && s_ccw != IN_PROGRESS )
break;
// Safety valve
if( path_cw.Line().Length() > lengthLimit && path_ccw.Line().Length() > lengthLimit )
break;
m_iteration++;
}