@@ -75,22 +75,22 @@ pub trait EuclideanDistance<T, Rhs = Self> {
75
75
/// Minimum distance between a Point and a Line segment
76
76
/// This is a helper for Point-to-LineString and Point-to-Polygon distance
77
77
/// Adapted from https://github.com/OSGeo/geos/blob/master/src/algorithm/CGAlgorithms.cpp#L191
78
- fn line_segment_distance < T > ( point : & Point < T > , start : & Point < T > , end : & Point < T > ) -> T
78
+ fn line_segment_distance < T > ( point : Point < T > , start : Point < T > , end : Point < T > ) -> T
79
79
where
80
80
T : Float + ToPrimitive ,
81
81
{
82
82
if start == end {
83
- return point. euclidean_distance ( start) ;
83
+ return point. euclidean_distance ( & start) ;
84
84
}
85
85
let dx = end. x ( ) - start. x ( ) ;
86
86
let dy = end. y ( ) - start. y ( ) ;
87
87
let r =
88
88
( ( point. x ( ) - start. x ( ) ) * dx + ( point. y ( ) - start. y ( ) ) * dy) / ( dx. powi ( 2 ) + dy. powi ( 2 ) ) ;
89
89
if r <= T :: zero ( ) {
90
- return point. euclidean_distance ( start) ;
90
+ return point. euclidean_distance ( & start) ;
91
91
}
92
92
if r >= T :: one ( ) {
93
- return point. euclidean_distance ( end) ;
93
+ return point. euclidean_distance ( & end) ;
94
94
}
95
95
let s = ( ( start. y ( ) - point. y ( ) ) * dx - ( start. x ( ) - point. x ( ) ) * dy) / ( dx * dx + dy * dy) ;
96
96
s. abs ( ) * dx. hypot ( dy)
@@ -151,7 +151,7 @@ where
151
151
polygon
152
152
. exterior
153
153
. lines ( )
154
- . map ( |line| line_segment_distance ( self , & line. start , & line. end ) )
154
+ . map ( |line| line_segment_distance ( * self , line. start , line. end ) )
155
155
. fold ( T :: max_value ( ) , |accum, val| accum. min ( val) ) ,
156
156
)
157
157
}
@@ -226,7 +226,7 @@ where
226
226
}
227
227
linestring
228
228
. lines ( )
229
- . map ( |line| line_segment_distance ( self , & line. start , & line. end ) )
229
+ . map ( |line| line_segment_distance ( * self , line. start , line. end ) )
230
230
. fold ( T :: max_value ( ) , |accum, val| accum. min ( val) )
231
231
}
232
232
}
@@ -247,7 +247,7 @@ where
247
247
{
248
248
/// Minimum distance from a Line to a Point
249
249
fn euclidean_distance ( & self , point : & Point < T > ) -> T {
250
- line_segment_distance ( point, & self . start , & self . end )
250
+ line_segment_distance ( * point, self . start , self . end )
251
251
}
252
252
}
253
253
@@ -279,7 +279,7 @@ where
279
279
/// is disjoint because it's contained in the inner ring
280
280
/// we work around this by checking that Polygons with inner rings don't
281
281
/// contain a point from the candidate Polygon's outer shell in their simple representations
282
- fn ring_contains_point < T > ( poly : & Polygon < T > , p : & Point < T > ) -> bool
282
+ fn ring_contains_point < T > ( poly : & Polygon < T > , p : Point < T > ) -> bool
283
283
where
284
284
T : Float ,
285
285
{
@@ -319,7 +319,7 @@ where
319
319
fn euclidean_distance ( & self , other : & Polygon < T > ) -> T {
320
320
if self . intersects ( other) || other. contains ( self ) {
321
321
T :: zero ( )
322
- } else if !other. interiors . is_empty ( ) && ring_contains_point ( other, & self . 0 [ 0 ] ) {
322
+ } else if !other. interiors . is_empty ( ) && ring_contains_point ( other, self . 0 [ 0 ] ) {
323
323
// check each ring distance, returning the minimum
324
324
let mut mindist: T = Float :: max_value ( ) ;
325
325
for ring in & other. interiors {
@@ -434,14 +434,14 @@ where
434
434
return T :: zero ( ) ;
435
435
}
436
436
// Containment check
437
- if !self . interiors . is_empty ( ) && ring_contains_point ( self , & poly2. exterior . 0 [ 0 ] ) {
437
+ if !self . interiors . is_empty ( ) && ring_contains_point ( self , poly2. exterior . 0 [ 0 ] ) {
438
438
// check each ring distance, returning the minimum
439
439
let mut mindist: T = Float :: max_value ( ) ;
440
440
for ring in & self . interiors {
441
441
mindist = mindist. min ( nearest_neighbour_distance ( & poly2. exterior , ring) )
442
442
}
443
443
return mindist;
444
- } else if !poly2. interiors . is_empty ( ) && ring_contains_point ( poly2, & self . exterior . 0 [ 0 ] ) {
444
+ } else if !poly2. interiors . is_empty ( ) && ring_contains_point ( poly2, self . exterior . 0 [ 0 ] ) {
445
445
let mut mindist: T = Float :: max_value ( ) ;
446
446
for ring in & poly2. interiors {
447
447
mindist = mindist. min ( nearest_neighbour_distance ( & self . exterior , ring) )
@@ -495,17 +495,17 @@ mod test {
495
495
let p1 = Point :: new ( 7.2 , 2.0 ) ;
496
496
let p2 = Point :: new ( 6.0 , 1.0 ) ;
497
497
498
- let dist = line_segment_distance ( & o1, & p1, & p2) ;
499
- let dist2 = line_segment_distance ( & o2, & p1, & p2) ;
500
- let dist3 = line_segment_distance ( & o3, & p1, & p2) ;
501
- let dist4 = line_segment_distance ( & o4, & p1, & p2) ;
498
+ let dist = line_segment_distance ( o1, p1, p2) ;
499
+ let dist2 = line_segment_distance ( o2, p1, p2) ;
500
+ let dist3 = line_segment_distance ( o3, p1, p2) ;
501
+ let dist4 = line_segment_distance ( o4, p1, p2) ;
502
502
// Results agree with Shapely
503
503
assert_relative_eq ! ( dist, 2.0485900789263356 ) ;
504
504
assert_relative_eq ! ( dist2, 1.118033988749895 ) ;
505
505
assert_relative_eq ! ( dist3, 1.4142135623730951 ) ;
506
506
assert_relative_eq ! ( dist4, 1.5811388300841898 ) ;
507
507
// Point is on the line
508
- let zero_dist = line_segment_distance ( & p1, & p1, & p2) ;
508
+ let zero_dist = line_segment_distance ( p1, p1, p2) ;
509
509
assert_relative_eq ! ( zero_dist, 0.0 ) ;
510
510
}
511
511
#[ test]
0 commit comments