VECTOR2I PNS_LINE::snapToNeighbourSegments( const SHAPE_LINE_CHAIN& aPath, const VECTOR2I &aP, int aIndex, int aThreshold ) const { VECTOR2I snap_p[2]; DIRECTION_45 dragDir( aPath.CSegment( aIndex ) ); int snap_d[2] = { -1, -1 }; if( aThreshold == 0 ) return aP; if( aIndex >= 2 ) { SEG s = aPath.CSegment( aIndex - 2 ); if( DIRECTION_45( s ) == dragDir ) snap_d[0] = s.LineDistance( aP ); snap_p[0] = s.A; } if( aIndex < aPath.SegmentCount() - 2 ) { SEG s = aPath.CSegment( aIndex + 2 ); if( DIRECTION_45( s ) == dragDir ) snap_d[1] = s.LineDistance(aP); snap_p[1] = s.A; } VECTOR2I best = aP; int minDist = INT_MAX; for( int i = 0; i < 2; i++ ) { if( snap_d[i] >= 0 && snap_d[i] < minDist && snap_d[i] <= aThreshold ) { minDist = snap_d[i]; best = snap_p[i]; } } return best; }
const VECTOR2I SHAPE_LINE_CHAIN::NearestPoint( const SEG& aSeg, int& dist ) const { int nearest = 0; dist = INT_MAX; for( int i = 0; i < PointCount(); i++ ) { int d = aSeg.LineDistance( CPoint( i ) ); if( d < dist ) { dist = d; nearest = i; } } return CPoint( nearest ); }