Mercurial > hg > nsaunier > traffic-intelligence
comparison python/moving.py @ 27:44689029a86f
updated segmentIntersection and other
| author | Nicolas Saunier <nico@confins.net> |
|---|---|
| date | Sat, 05 Dec 2009 15:40:28 -0500 |
| parents | 54d9cb0c902b |
| children | 9ae709a2e8d0 |
comparison
equal
deleted
inserted
replaced
| 26:54d9cb0c902b | 27:44689029a86f |
|---|---|
| 22 self.first=first | 22 self.first=first |
| 23 self.last=last | 23 self.last=last |
| 24 | 24 |
| 25 def __str__(self): | 25 def __str__(self): |
| 26 return '%d %d'%(self.first, self.last) | 26 return '%d %d'%(self.first, self.last) |
| 27 | |
| 28 def __iter__(self): | |
| 29 self.iterInstantNum = 0 | |
| 30 return self | |
| 31 | |
| 32 def next(self): | |
| 33 if self.iterInstantNum >= self.length(): | |
| 34 raise StopIteration | |
| 35 else: | |
| 36 self.iterInstantNum += 1 | |
| 37 return self.first+self.iterInstantNum | |
| 38 | 27 |
| 39 def empty(self): | 28 def empty(self): |
| 40 ''' | 29 ''' |
| 41 >>> Interval().empty() | 30 >>> Interval().empty() |
| 42 True | 31 True |
| 73 | 62 |
| 74 def intersection(self, interval2): | 63 def intersection(self, interval2): |
| 75 '''Largest interval comprising self and interval2''' | 64 '''Largest interval comprising self and interval2''' |
| 76 return TimeInterval(max(self.first, interval2.first), min(self.last, interval2.last)) | 65 return TimeInterval(max(self.first, interval2.first), min(self.last, interval2.last)) |
| 77 | 66 |
| 78 def TimeInterval(Interval): | 67 |
| 68 class TimeInterval(Interval): | |
| 79 '''Temporal interval''' | 69 '''Temporal interval''' |
| 80 | 70 |
| 81 def __init__(self, first=0, last=-1): | 71 def __init__(self, first=0, last=-1): |
| 82 Interval.__init__(self, first, last, False) | 72 Interval.__init__(self, first, last, False) |
| 73 | |
| 74 def __getitem__(self, i): | |
| 75 if not self.empty(): | |
| 76 return self.first+i | |
| 77 | |
| 78 def __iter__(self): | |
| 79 self.iterInstantNum = 0 | |
| 80 return self | |
| 81 | |
| 82 def next(self): | |
| 83 if self.iterInstantNum >= self.length(): | |
| 84 raise StopIteration | |
| 85 else: | |
| 86 self.iterInstantNum += 1 | |
| 87 return self[self.iterInstantNum] | |
| 83 | 88 |
| 84 def length(self): | 89 def length(self): |
| 85 '''Returns the length of the interval | 90 '''Returns the length of the interval |
| 86 | 91 |
| 87 >>> TimeInterval(0,1).length() | 92 >>> TimeInterval(0,1).length() |
| 230 | 235 |
| 231 def getInstantPassingLane(self, p1, p2): | 236 def getInstantPassingLane(self, p1, p2): |
| 232 '''Returns the instant(s) the object passes from one side of the segment to the other | 237 '''Returns the instant(s) the object passes from one side of the segment to the other |
| 233 empty list if not''' | 238 empty list if not''' |
| 234 instants = [] | 239 instants = [] |
| 235 lane = [[p1[0],p2[0]], [p1[1],p2[1]]] | |
| 236 | |
| 237 # refaire tout en points, marche pas | |
| 238 # self.positions[i] self.positions[i+1] | |
| 239 | 240 |
| 240 for i in xrange(self.length()-1): | 241 for i in xrange(self.length()-1): |
| 241 p = utils.segmentIntersection([self.positions[0][i:i+1],self.positions[1][i:i+1]], lane) | 242 p = utils.segmentIntersection(self.positions[i], self.positions[i+1], p1, p2) |
| 242 if p: # interpolate the instant | 243 if p: |
| 243 if self.positions[0][i] != self.positions[0][i+1]: | 244 if self.positions[i].x != self.positions[i+1].x: |
| 244 ratio = (p[0]-self.positions[0][i])/(self.positions[0][i+1]-self.positions[0][i]) | 245 ratio = (p.x-self.positions[i].x)/(self.positions[i+1].x-self.positions[i].x) |
| 245 elif self.positions[1][i] != self.positions[1][i+1]: | 246 elif self.positions[i].y != self.positions[i+1].y: |
| 246 ratio = (p[1]-self.positions[1][i])/(self.positions[1][i+1]-self.positions[1][i]) | 247 ratio = (p.y-self.positions[i].y)/(self.positions[i+1].y-self.positions[i].y) |
| 247 else: | 248 else: |
| 248 ratio = 0 | 249 ratio = 0 |
| 249 instants.append(self.timeInterval[i]*(1-ratio)+ratio*self.timeInterval[i+1]) | 250 instants.append(self.timeInterval[i]*(1-ratio)+ratio*self.timeInterval[i+1]) |
| 250 return instants | 251 return instants |
| 252 | |
| 251 # def computeVelocities(self): | 253 # def computeVelocities(self): |
| 252 | 254 |
| 253 # need for a class representing the indicators, their units, how to print them in graphs... | 255 # need for a class representing the indicators, their units, how to print them in graphs... |
| 254 class TemporalIndicator: | 256 class TemporalIndicator: |
| 255 '''Class for temporal indicators | 257 '''Class for temporal indicators |
