diff --git a/libs/kimath/src/geometry/shape_line_chain.cpp b/libs/kimath/src/geometry/shape_line_chain.cpp index 944d0ddf97..da545d0901 100644 --- a/libs/kimath/src/geometry/shape_line_chain.cpp +++ b/libs/kimath/src/geometry/shape_line_chain.cpp @@ -1918,24 +1918,30 @@ bool SHAPE_LINE_CHAIN_BASE::PointOnEdge( const VECTOR2I& aPt, int aAccuracy ) co int SHAPE_LINE_CHAIN_BASE::EdgeContainingPoint( const VECTOR2I& aPt, int aAccuracy ) const { - if( !GetPointCount() ) + const int threshold = aAccuracy + 1; + const int64_t thresholdSq = int64_t( threshold ) * threshold; + const size_t pointCount = GetPointCount(); + + if( !pointCount ) { - return -1; + return -1; } - else if( GetPointCount() == 1 ) + else if( pointCount == 1 ) { - VECTOR2I dist = GetPoint(0) - aPt; - return ( hypot( dist.x, dist.y ) <= aAccuracy + 1 ) ? 0 : -1; + SEG::ecoord distSq = GetPoint( 0 ).SquaredDistance( aPt ); + return distSq <= thresholdSq ? 0 : -1; } - for( size_t i = 0; i < GetSegmentCount(); i++ ) + const size_t segCount = GetSegmentCount(); + + for( size_t i = 0; i < segCount; i++ ) { const SEG s = GetSegment( i ); if( s.A == aPt || s.B == aPt ) return i; - if( s.Distance( aPt ) <= aAccuracy + 1 ) + if( s.SquaredDistance( aPt ) <= thresholdSq ) return i; }