Mercurial > hg > nsaunier > traffic-intelligence
comparison python/moving.py @ 288:e0d41c7f53d4
updated class/method descriptions
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Tue, 29 Jan 2013 10:36:17 -0500 |
| parents | f2cf16ad798f |
| children | df58d361f19e |
comparison
equal
deleted
inserted
replaced
| 287:66691c06928c | 288:e0d41c7f53d4 |
|---|---|
| 9 #from shapely.geometry import Polygon | 9 #from shapely.geometry import Polygon |
| 10 | 10 |
| 11 __metaclass__ = type | 11 __metaclass__ = type |
| 12 | 12 |
| 13 class Interval: | 13 class Interval: |
| 14 '''Generic Interval''' | 14 '''Generic interval: a subset of real numbers (not iterable)''' |
| 15 def __init__(self, first=0, last=-1, revert = False): | 15 def __init__(self, first=0, last=-1, revert = False): |
| 16 'Warning, do not revert if last<first, it contradicts the definition of empty' | |
| 17 if revert and last<first: | 16 if revert and last<first: |
| 18 self.first=last | 17 self.first=last |
| 19 self.last=first | 18 self.last=first |
| 20 else: | 19 else: |
| 21 self.first=first | 20 self.first=first |
| 42 | 41 |
| 43 def contains(self, instant): | 42 def contains(self, instant): |
| 44 return (self.first<=instant and self.last>=instant) | 43 return (self.first<=instant and self.last>=instant) |
| 45 | 44 |
| 46 def inside(self, interval2): | 45 def inside(self, interval2): |
| 47 'indicates if the temporal interval of self is comprised in interval2' | 46 '''Indicates if the temporal interval of self is comprised in interval2''' |
| 48 return (self.first >= interval2.first) and (self.last <= interval2.last) | 47 return (self.first >= interval2.first) and (self.last <= interval2.last) |
| 49 | 48 |
| 50 def union(self, interval2): | 49 def union(self, interval2): |
| 51 '''Smallest interval comprising self and interval2''' | 50 '''Smallest interval comprising self and interval2''' |
| 52 return Interval(min(self.first, interval2.first), max(self.last, interval2.last)) | 51 return Interval(min(self.first, interval2.first), max(self.last, interval2.last)) |
| 73 inter = inter.union(i) | 72 inter = inter.union(i) |
| 74 return inter | 73 return inter |
| 75 | 74 |
| 76 | 75 |
| 77 class TimeInterval(Interval): | 76 class TimeInterval(Interval): |
| 78 '''Temporal interval based on frame numbers (hence the modified length method) | 77 '''Temporal interval: set of instants at fixed time step, between first and last, included |
| 79 may be modified directly by setting first and last''' | 78 |
| 79 For example: based on frame numbers (hence the modified length method) | |
| 80 It may be modified directly by setting first and last''' | |
| 80 | 81 |
| 81 def __init__(self, first=0, last=-1): | 82 def __init__(self, first=0, last=-1): |
| 82 Interval.__init__(self, first, last, False) | 83 Interval.__init__(self, first, last, False) |
| 83 | 84 |
| 84 def __getitem__(self, i): | 85 def __getitem__(self, i): |
| 105 # with methods to create intersection, unions... | 106 # with methods to create intersection, unions... |
| 106 # ''' | 107 # ''' |
| 107 # We will use the polygon class of Shapely | 108 # We will use the polygon class of Shapely |
| 108 | 109 |
| 109 class STObject: | 110 class STObject: |
| 110 '''Class for spatio-temporal object | 111 '''Class for spatio-temporal object, i.e. with temporal and spatial existence |
| 111 i.e. with temporal and spatial existence | |
| 112 (time interval and bounding polygon for positions (e.g. rectangle)). | 112 (time interval and bounding polygon for positions (e.g. rectangle)). |
| 113 It does not mean that the object is defined | 113 |
| 114 It may not mean that the object is defined | |
| 114 for all time instants within the time interval''' | 115 for all time instants within the time interval''' |
| 115 | 116 |
| 116 def __init__(self, num = None, timeInterval = None, boundingPolygon = None): | 117 def __init__(self, num = None, timeInterval = None, boundingPolygon = None): |
| 117 self.num = num | 118 self.num = num |
| 118 self.timeInterval = timeInterval | 119 self.timeInterval = timeInterval |
| 166 def norm2Squared(self): | 167 def norm2Squared(self): |
| 167 '''2-norm distance (Euclidean distance)''' | 168 '''2-norm distance (Euclidean distance)''' |
| 168 return self.x*self.x+self.y*self.y | 169 return self.x*self.x+self.y*self.y |
| 169 | 170 |
| 170 def norm2(self): | 171 def norm2(self): |
| 171 '2-norm distance (Euclidean distance)' | 172 '''2-norm distance (Euclidean distance)''' |
| 172 return sqrt(self.norm2Squared()) | 173 return sqrt(self.norm2Squared()) |
| 173 | 174 |
| 174 def norm1(self): | 175 def norm1(self): |
| 175 return abs(self.x)+abs(self.y) | 176 return abs(self.x)+abs(self.y) |
| 176 | 177 |
| 233 def plotAll(points, color='r'): | 234 def plotAll(points, color='r'): |
| 234 from matplotlib.pyplot import scatter | 235 from matplotlib.pyplot import scatter |
| 235 scatter([p.x for p in points],[p.y for p in points], c=color) | 236 scatter([p.x for p in points],[p.y for p in points], c=color) |
| 236 | 237 |
| 237 class NormAngle: | 238 class NormAngle: |
| 238 'alternate encoding of a point, by its norm and orientation' | 239 '''Alternate encoding of a point, by its norm and orientation''' |
| 239 | 240 |
| 240 def __init__(self, norm, angle): | 241 def __init__(self, norm, angle): |
| 241 self.norm = norm | 242 self.norm = norm |
| 242 self.angle = angle | 243 self.angle = angle |
| 243 | 244 |
| 326 return None | 327 return None |
| 327 | 328 |
| 328 # TODO: implement a better algorithm for intersections of sets of segments http://en.wikipedia.org/wiki/Line_segment_intersection | 329 # TODO: implement a better algorithm for intersections of sets of segments http://en.wikipedia.org/wiki/Line_segment_intersection |
| 329 | 330 |
| 330 class Trajectory: | 331 class Trajectory: |
| 331 '''Class for trajectories | 332 '''Class for trajectories: temporal sequence of positions |
| 332 i.e. a temporal sequence of positions | 333 |
| 333 | 334 The class is iterable''' |
| 334 the class is iterable.''' | |
| 335 | 335 |
| 336 def __init__(self, positions=None): | 336 def __init__(self, positions=None): |
| 337 if positions != None: | 337 if positions != None: |
| 338 self.positions = positions | 338 self.positions = positions |
| 339 else: | 339 else: |
| 524 'truck'] | 524 'truck'] |
| 525 | 525 |
| 526 userType2Num = utils.inverseEnumeration(userTypeNames) | 526 userType2Num = utils.inverseEnumeration(userTypeNames) |
| 527 | 527 |
| 528 class MovingObject(STObject): | 528 class MovingObject(STObject): |
| 529 '''Class for moving objects | 529 '''Class for moving objects: a spatio-temporal object |
| 530 i.e. with a trajectory and a geometry (volume) (constant) | 530 with a trajectory and a geometry (constant volume over time) and a usertype (e.g. road user) |
| 531 and a usertype (e.g. road user) | |
| 532 ''' | 531 ''' |
| 533 | 532 |
| 534 def __init__(self, num = None, timeInterval = None, positions = None, geometry = None, userType = None): | 533 def __init__(self, num = None, timeInterval = None, positions = None, geometry = None, userType = None): |
| 535 STObject.__init__(self, num, timeInterval) | 534 STObject.__init__(self, num, timeInterval) |
| 536 self.positions = positions | 535 self.positions = positions |
| 635 suite = doctest.DocFileSuite('tests/moving.txt') | 634 suite = doctest.DocFileSuite('tests/moving.txt') |
| 636 #suite = doctest.DocTestSuite() | 635 #suite = doctest.DocTestSuite() |
| 637 unittest.TextTestRunner().run(suite) | 636 unittest.TextTestRunner().run(suite) |
| 638 #doctest.testmod() | 637 #doctest.testmod() |
| 639 #doctest.testfile("example.txt") | 638 #doctest.testfile("example.txt") |
| 640 |
