Mercurial > hg > nsaunier > traffic-intelligence
comparison python/utils.py @ 24:6fb59cfb201e
first version of segmentIntersection
| author | Nicolas Saunier <nico@confins.net> |
|---|---|
| date | Sat, 05 Dec 2009 11:04:03 -0500 |
| parents | 5a21d2cfee44 |
| children | 44689029a86f |
comparison
equal
deleted
inserted
replaced
| 23:5f2921ad4f7e | 24:6fb59cfb201e |
|---|---|
| 5 #from pylab import * | 5 #from pylab import * |
| 6 | 6 |
| 7 __metaclass__ = type | 7 __metaclass__ = type |
| 8 | 8 |
| 9 commentChar = '#'; | 9 commentChar = '#'; |
| 10 | |
| 11 # maths | |
| 12 | |
| 13 def segmentIntersection(s1, s2): | |
| 14 '''Returns the intersecting point, None otherwise | |
| 15 format for a segment is [[x1, x2], [y1,y2]] | |
| 16 | |
| 17 >>> segmentIntersection([[0, 1], [0,1]], [[0, 1], [1,2]]) | |
| 18 >>> segmentIntersection([[0, 1], [1,0]], [[0, 1], [2,1]]) | |
| 19 >>> segmentIntersection([[0, 2], [0,0]], [[1, 1], [-1,1]]) | |
| 20 [1.0, 0.0] | |
| 21 >>> segmentIntersection([[0, 2], [0,0]], [[1, 1], [1,2]]) | |
| 22 ''' | |
| 23 from numpy import matrix | |
| 24 from numpy.linalg import linalg, det | |
| 25 | |
| 26 ds1 = [s1[0][1]-s1[0][0], s1[1][1]-s1[1][0]] | |
| 27 ds2 = [s2[0][1]-s2[0][0], s2[1][1]-s2[1][0]] | |
| 28 | |
| 29 A = matrix([[ds1[1], -ds1[0]], | |
| 30 [ds2[1], -ds2[0]]]) | |
| 31 B = matrix([[ds1[1]*s1[0][0]-ds1[0]*s1[1][0]], | |
| 32 [ds2[1]*s2[0][0]-ds2[0]*s2[1][0]]]) | |
| 33 | |
| 34 if linalg.det(A) == 0:#crossProduct(ds1, ds2) == 0: | |
| 35 return None | |
| 36 else: | |
| 37 intersection = linalg.solve(A,B) | |
| 38 if (intersection[0,0] >= s1[0][0] and intersection[0,0] <= s1[0][1] | |
| 39 and intersection[0,0] >= s2[0][0] and intersection[0,0] <= s2[0][1] | |
| 40 and intersection[1,0] >= s1[1][0] and intersection[1,0] <= s1[1][1] | |
| 41 and intersection[1,0] >= s2[1][0] and intersection[1,0] <= s2[1][1]): | |
| 42 return [intersection[0,0], intersection[1,0]] | |
| 43 else: | |
| 44 return None | |
| 45 | |
| 46 def crossProduct(l1, l2): | |
| 47 return l1[0]*l2[1]-l1[1]*l2[0] | |
| 48 | |
| 49 # file I/O | |
| 10 | 50 |
| 11 def openCheck(filename, option = 'r', quit = False): | 51 def openCheck(filename, option = 'r', quit = False): |
| 12 '''Open file filename in read mode by default | 52 '''Open file filename in read mode by default |
| 13 and checks it is open | 53 and checks it is open |
| 14 | 54 |
