Exemple #1
0
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;
}