bool PolyLine2::FindPath( const Seg2& moveSeg, PolyLine2& path ) const { path.Clear(); const Vec2& a = moveSeg.a; const Vec2& b = moveSeg.b; if (!PtIn( a ) || !PtIn( b )) return false; int nPt = m_Points.size(); Vec2 pt; float minDist = FLT_MAX; float maxDist = 0.0f; int nBeg1 = -1; int nBeg2 = -1; int nEnd1 = -1; int nEnd2 = -1; for (int i = 0; i < nPt; i++) { Seg2 seg = GetEdge( i ); if (!seg.intersects( moveSeg, false, &pt )) continue; float dist = pt.dist2( a ); if (dist < minDist) { minDist = dist; nBeg1 = i; nBeg2 = i + 1; } if (dist > maxDist) { maxDist = dist; nEnd1 = i + 1; nEnd2 = i; } } GetSubPoly( nBeg1, nEnd1, path, false ); path.InsertPoint( 0, a ); path.AddPoint( b ); float len = path.GetLength( false ); GetSubPoly( nBeg2, nEnd2, path, true ); path.InsertPoint( 0, a ); path.AddPoint( b ); if (path.GetLength( false ) > len) { GetSubPoly( nBeg1, nEnd1, path, false ); path.InsertPoint( 0, a ); path.AddPoint( b ); } return true; }