LineSegment.st
changeset 2151 608380d995e6
parent 2125 c61d3499d19b
child 2152 ad1307561fe5
--- a/LineSegment.st	Sat May 30 00:11:35 2009 +0200
+++ b/LineSegment.st	Sat Jun 06 12:05:58 2009 +0200
@@ -287,6 +287,45 @@
     "Created: 12.2.1997 / 11:43:50 / cg"
 !
 
+dist:p
+    "the distance of aPoint to this segment"
+
+    |a b u v px py ax ay bx by|
+
+    a := startPoint.
+    b := endPoint.
+    ax := a x.
+    ay := a y.
+    bx := b x.
+    by := b y.
+    px := p x.
+    py := p y.
+
+    u := p - a.
+    v := b - a.
+    ((u x * v x) + (u y * v y)) < 0 ifTrue:[
+        ^ (( px - ax) squared + (py - ay) squared) sqrt
+    ].
+
+    u := p - b.
+    v := v negated.
+    ((u x * v x) + (u y * v y)) < 0 ifTrue:[
+        ^ (( px - bx) squared + (py - by) squared) sqrt
+    ].
+
+    ^( (( px * ( ay - by )) + (py * ( bx - ax )) + ( (ax * by) - (bx * ay) ) ) 
+     / ( ( bx - ax )squared + ( by - ay )squared ) sqrt ) abs
+
+    "
+     (LineSegment from:(0@0) to:(10@10)) dist:0@0      
+     (LineSegment from:(0@0) to:(10@10)) dist:10@10    
+     (LineSegment from:(0@0) to:(10@10)) dist:-1@-1    
+     (LineSegment from:(0@0) to:(10@10)) dist:5@5      
+     (LineSegment from:(0@0) to:(10@10)) dist:6@4      
+     (LineSegment from:(0@0) to:(10@10)) dist:5@0      
+    "
+!
+
 isHorizontal
     "return true, if I am a horizontal line"
 
@@ -332,5 +371,5 @@
 !LineSegment class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/LineSegment.st,v 1.19 2009-02-26 21:28:32 stefan Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/LineSegment.st,v 1.20 2009-06-06 10:05:58 cg Exp $'
 ! !