changeset 327:42f2b46ec210

added class for trajectories in curvilinear coordinates
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 12 Jun 2013 17:28:34 -0400
parents f7872d15a6cc
children 5e43b7389c25
files python/moving.py python/storage.py
diffstat 2 files changed, 43 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/python/moving.py	Thu May 23 17:57:11 2013 +0200
+++ b/python/moving.py	Wed Jun 12 17:28:34 2013 -0400
@@ -339,7 +339,7 @@
     The class is iterable'''
 
     def __init__(self, positions=None):
-        if positions != None:
+        if positions:
             self.positions = positions
         else:
             self.positions = [[],[]]
@@ -356,6 +356,12 @@
             t.addPosition(p)
         return t
 
+    def __len__(self):
+        return len(self.positions[0])
+
+    def length(self):
+        return self.__len__()
+
     def __str__(self):
         return ' '.join([self.__getitem__(i).__str__() for i in xrange(self.length())])
 
@@ -376,11 +382,13 @@
             self.iterInstantNum += 1
             return self[self.iterInstantNum-1]
 
-    def length(self):
-        return len(self.positions[0])
+    def setPositionXY(self, i, x, y):
+        if i < self.__len__():
+            self.positions[0][i] = x
+            self.positions[1][i] = y
 
-    def __len__(self):
-        return self.length()
+    def setPosition(self, i, p):
+        self.setPositionXY(i, p.x, p.y)
 
     def addPositionXY(self, x, y):
         self.positions[0].append(x)
@@ -516,6 +524,33 @@
     def normMaxLCSS(t1, t2, threshold):
         return utils.LCSS(t1, t2, threshold, lambda p1, p2: (p1-p2).normMax())
 
+class CurvilinearTrajectory(Trajectory):
+    '''Sub class of trajectory for trajectories with curvilinear coordinates and lane assignements
+    longitudinal coordinate is stored as first coordinate (exterior name S)
+    lateral coordiante is stored as second coordinate'''
+
+    def __init__(self, S = [], Y = [], lanes = []):
+        self.positions = [S,Y]
+        self.lanes = lanes
+        
+    def __getitem__(self,i): 
+        return [self.positions[0][i], self.positions[1][i], self.lanes[i]]
+
+    def getSCoordinates(self):
+        return self.getXCoordinates()
+    
+    def getLanes(self):
+        return self.lanes
+
+    def addPosition(self, s, y, lane):
+        self.addPositionXY(s,y)
+        self.lanes.append(lane)
+
+    def setPosition(self, i, s, y, lane):
+        self.setPositionXY(i, s, y)
+        if i < self.__len__():
+            self.lanes[i] = lane
+
 ##################
 # Moving Objects
 ##################
--- a/python/storage.py	Thu May 23 17:57:11 2013 +0200
+++ b/python/storage.py	Wed Jun 12 17:28:34 2013 -0400
@@ -220,7 +220,7 @@
         obj.followingVehicles = [int(numbers[15])] # following vehicle (after)
         obj.spaceHeadways = [float(numbers[16])] # feet
         obj.timeHeadways = [float(numbers[17])] # seconds
-        obj.curvilinearPositions = moving.Trajectory([[float(numbers[5])],[float(numbers[4])]]) # X is the longitudinal coordinate
+        obj.curvilinearPositions = moving.CurvilinearTrajectory([float(numbers[5])],[float(numbers[4])], obj.laneNums) # X is the longitudinal coordinate
         obj.speeds = [float(numbers[11])]
         obj.size = [float(numbers[8]), float(numbers[9])] # 8 lengh, 9 width # TODO: temporary, should use a geometry object
         return obj
@@ -242,10 +242,10 @@
                 break
             obj = createObject(numbers)
         else:
+            obj.laneNums.append(int(numbers[13]))
             obj.positions.addPositionXY(float(numbers[6]), float(numbers[7]))
-            obj.curvilinearPositions.addPositionXY(float(numbers[5]), float(numbers[4]))
+            obj.curvilinearPositions.addPosition(float(numbers[5]), float(numbers[4]), obj.laneNums[-1])
             obj.speeds.append(float(numbers[11]))
-            obj.laneNums.append(int(numbers[13]))
             obj.precedingVehicles.append(int(numbers[14]))
             obj.followingVehicles.append(int(numbers[15]))
             obj.spaceHeadways.append(float(numbers[16]))