@@ -60,7 +60,7 @@ public double DistanceSquared(Vector2d p)
6060 else if ( t <= - Extent )
6161 return P0 . DistanceSquared ( p ) ;
6262 Vector2d proj = Center + t * Direction ;
63- return ( proj - p ) . LengthSquared ;
63+ return proj . DistanceSquared ( p ) ;
6464 }
6565 public double DistanceSquared ( Vector2d p , out double t )
6666 {
@@ -73,7 +73,7 @@ public double DistanceSquared(Vector2d p, out double t)
7373 return P0 . DistanceSquared ( p ) ;
7474 }
7575 Vector2d proj = Center + t * Direction ;
76- return ( proj - p ) . LengthSquared ;
76+ return proj . DistanceSquared ( p ) ;
7777 }
7878
7979 public Vector2d NearestPoint ( Vector2d p )
@@ -151,6 +151,33 @@ public void Reverse() {
151151 public IParametricCurve2d Clone ( ) {
152152 return new Segment2d ( this . Center , this . Direction , this . Extent ) ;
153153 }
154+
155+
156+
157+ /// <summary>
158+ /// distance from pt to segment (a,b), with no square roots
159+ /// </summary>
160+ public static double FastDistanceSquared ( ref Vector2d a , ref Vector2d b , ref Vector2d pt )
161+ {
162+ double vx = b . x - a . x , vy = b . y - a . y ;
163+ double len2 = vx * vx + vy * vy ;
164+ double dx = pt . x - a . x , dy = pt . y - a . y ;
165+ if ( len2 < 1e-13 ) {
166+ return dx * dx + dy * dy ;
167+ }
168+ double t = ( dx * vx + dy * vy ) ;
169+ if ( t <= 0 ) {
170+ return dx * dx + dy * dy ;
171+ } else if ( t >= len2 ) {
172+ dx = pt . x - b . x ; dy = pt . y - b . y ;
173+ return dx * dx + dy * dy ;
174+ }
175+
176+ dx = pt . x - ( a . x + ( ( t * vx ) / len2 ) ) ;
177+ dy = pt . y - ( a . y + ( ( t * vy ) / len2 ) ) ;
178+ return dx * dx + dy * dy ;
179+ }
180+
154181 }
155182
156183
@@ -233,6 +260,34 @@ void update_from_endpoints(Vector2f p0, Vector2f p1)
233260 Direction = p1 - p0 ;
234261 Extent = 0.5f * Direction . Normalize ( ) ;
235262 }
263+
264+
265+
266+
267+ /// <summary>
268+ /// distance from pt to segment (a,b), with no square roots
269+ /// </summary>
270+ public static float FastDistanceSquared ( ref Vector2f a , ref Vector2f b , ref Vector2f pt )
271+ {
272+ float vx = b . x - a . x , vy = b . y - a . y ;
273+ float len2 = vx * vx + vy * vy ;
274+ float dx = pt . x - a . x , dy = pt . y - a . y ;
275+ if ( len2 < 1e-7 ) {
276+ return dx * dx + dy * dy ;
277+ }
278+ float t = ( dx * vx + dy * vy ) ;
279+ if ( t <= 0 ) {
280+ return dx * dx + dy * dy ;
281+ } else if ( t >= len2 ) {
282+ dx = pt . x - b . x ; dy = pt . y - b . y ;
283+ return dx * dx + dy * dy ;
284+ }
285+
286+ dx = pt . x - ( a . x + ( ( t * vx ) / len2 ) ) ;
287+ dy = pt . y - ( a . y + ( ( t * vy ) / len2 ) ) ;
288+ return dx * dx + dy * dy ;
289+ }
290+
236291 }
237292
238293
0 commit comments