comparison python/moving.py @ 1013:d6f121ded971

Moving pull request
author Wendlasida
date Fri, 01 Jun 2018 17:29:01 -0400
parents 01db14e947e4
children 026f6b3b122c
comparison
equal deleted inserted replaced
1012:01db14e947e4 1013:d6f121ded971
1152 1152
1153 @staticmethod 1153 @staticmethod
1154 def generate(num, p, v, timeInterval): 1154 def generate(num, p, v, timeInterval):
1155 positions, velocities = Trajectory.generate(p, v, int(timeInterval.length())) 1155 positions, velocities = Trajectory.generate(p, v, int(timeInterval.length()))
1156 return MovingObject(num = num, timeInterval = timeInterval, positions = positions, velocities = velocities) 1156 return MovingObject(num = num, timeInterval = timeInterval, positions = positions, velocities = velocities)
1157
1158
1159
1160 1157
1161 @staticmethod 1158 @staticmethod
1162 def generateWithFeatures(num, features, userType): 1159 def generateWithFeatures(num, features, userType):
1163 newObjectTMP = MovingObject.concatenateWith(features[0],features[1:],num) 1160 newObjectTMP = MovingObject.concatenateWith(features[0],features[1:],num)
1164 newObject = MovingObject(newObjectTMP.getNum() if num is None else num, newObjectTMP.getTimeInterval(), newObjectTMP.positions, newObjectTMP.velocities, userType = userType) 1161 newObject = MovingObject(newObjectTMP.getNum() if num is None else num, newObjectTMP.getTimeInterval(), newObjectTMP.positions, newObjectTMP.velocities, userType = userType)
1165 newObject.features = [copy.deepcopy(f) for f in features] 1162 newObject.features = [copy.deepcopy(f) for f in features]
1166 return newObject 1163 return newObject
1167 1164
1168 @staticmethod 1165 @staticmethod
1169 def concatenateWith(obj1, ObjectList=[], num = None): #Concatenate with a list of MovingObjects 1166 def concatenateWith(obj1, ObjectList=[], num = None): #Concatenate with a list of MovingObjects
1170 if len(ObjectList)==0: 1167 if len(ObjectList)==0:
1171 newObject = MovingObject(obj1.getNum() if num is None else num, obj1.getTimeInterval(), obj1.positions, obj1.velocities, userType = obj1.getUserType()) 1168 newObject = MovingObject(obj1.getNum() if num is None else num, obj1.getTimeInterval(), obj1.positions, obj1.velocities, userType = obj1.getUserType())
1178 newObject = MovingObject.concatenate(obj1, Order, num) 1175 newObject = MovingObject.concatenate(obj1, Order, num)
1179 ObjectList.remove(Order) 1176 ObjectList.remove(Order)
1180 newObject = MovingObject.concatenateWith(newObject,ObjectList) 1177 newObject = MovingObject.concatenateWith(newObject,ObjectList)
1181 return newObject 1178 return newObject
1182 1179
1183 '''@staticmethod
1184 def addFeatures(obj1, FeatureList=[], num = None): #Add features to an object
1185 if len(FeatureList)==0: #We return a clone
1186 newObject = MovingObject(obj1.getNum() if num is None else num, obj1.getTimeInterval(), obj1.positions, obj1.velocities, userType = obj1.getUserType())
1187 if obj1.features is not None:
1188 newObject.features = list(obj1.features)
1189 else :
1190 newObjectTMP = MovingObject.concatenateWith(obj1,FeatureList,num)
1191 newObject = MovingObject(newObjectTMP.getNum() if num is None else num, newObjectTMP.getTimeInterval(), newObjectTMP.positions, newObjectTMP.velocities, userType = newObjectTMP.getUserType())
1192 if obj1.hasFeatures() and newObjectTMP.hasFeatures():
1193 newObject.features = obj1.features + newObjectTMP.features
1194
1195 return newObject'''
1196
1197
1198 @staticmethod
1199 def delFeatures(obj1, FeatureList=[], num = None):
1200 if obj1.features is not None:
1201 if len(FeatureList)>0:
1202 tmp = [ i for i in (obj1.features if obj1.features is not None else []) if i not in FeatureList]
1203 if len(tmp)==0:
1204 newObject = MovingObject(obj1.getNum() if num is None else num, obj1.getTimeInterval(), obj1.positions, obj1.velocities, userType = obj1.getUserType())
1205 newObject.features = [MovingObject(obj1.getNum() if num is None else num, newInterval, obj1.positions, obj1.velocities, userType = obj1.getUserType())]
1206 elif len(obj1.features if obj1.features is not None else [])!=len(tmp):
1207 newInterval = TimeInterval(min([i.getFirstInstant() for i in tmp]), max([i.getLastInstant() for i in tmp]))
1208 positions = Trajectory()
1209 for t in newInterval:
1210 nTotal = 0.
1211 p = Point(0.,0.)
1212 for obj in tmp:
1213 if obj.existsAtInstant(t):
1214 if obj.hasFeatures():
1215 n = len([f for f in obj.getFeatures() if f.existsAtInstant(t)])
1216 else:
1217 n = 1.
1218 p += obj.getPositionAtInstant(t).__mul__(n)
1219 nTotal += n
1220 if nTotal==0:
1221 positions.addPosition(obj1.getPositionAtInstant(t))
1222 else:
1223 positions.addPosition(p.divide(nTotal))
1224 if hasattr(obj1, 'velocities'):
1225 velocities = Trajectory()
1226 for t in newInterval:
1227 nTotal = 0.
1228 p = Point(0.,0.)
1229 for obj in tmp:
1230 if obj.existsAtInstant(t):
1231 if obj.hasFeatures():
1232 n = len([f for f in obj.getFeatures() if f.existsAtInstant(t)])
1233 else:
1234 n = 1.
1235 p += obj.getVelocityAtInstant(t).__mul__(n)
1236 nTotal += n
1237 if nTotal==0:
1238 velocities.addPosition(obj1.getVelocityAtInstant(t))
1239 else:
1240 velocities.addPosition(p.divide(nTotal))
1241 else:
1242 velocities = None
1243
1244 newObject = MovingObject(obj1.getNum() if num is None else num, newInterval, positions, velocities, userType = obj1.getUserType())
1245 newObject.features = tmp+[MovingObject(obj1.getNum() if num is None else num, newInterval, positions, velocities, userType = obj1.getUserType())]
1246 else:
1247 newObject = MovingObject(obj1.getNum() if num is None else num, obj1.getTimeInterval(), obj1.positions, obj1.velocities, userType = obj1.getUserType())
1248 if obj1.features is not None:
1249 newObject.features = list(obj1.features)
1250 else:
1251 newObject = MovingObject(obj1.getNum() if num is None else num, obj1.getTimeInterval(), obj1.positions, obj1.velocities, userType = obj1.getUserType())
1252 return newObject
1253
1254
1255 def updatePosition(self): 1180 def updatePosition(self):
1256 if self.features is not None: 1181 if self.features is not None:
1257 positions = Trajectory() 1182 positions = Trajectory()
1258 for t in self.getTimeInterval(): 1183 for t in self.getTimeInterval():
1259 nTotal = 0. 1184 nTotal = 0.
1260 p = Point(0.,0.) 1185 p = Point(0.,0.)
1261 for obj in self.features: 1186 for obj in self.features:
1262 if obj.existsAtInstant(t): 1187 if obj.existsAtInstant(t):
1263 if obj.hasFeatures(): 1188 if obj.hasFeatures():
1264 n = len([f for f in obj.getFeatures() if f.existsAtInstant(t)]) 1189 n = len([f for f in obj.getFeatures() if f.existsAtInstant(t)])
1265 else: 1190 else:
1266 n = 1. 1191 n = 1.
1267 p += obj.getPositionAtInstant(t).__mul__(n) 1192 p += obj.getPositionAtInstant(t).__mul__(n)
1268 nTotal += n 1193 nTotal += n
1269 assert nTotal>0, 'there should be at least one point for each instant' 1194 assert nTotal>0, 'there should be at least one point for each instant'
1270 positions.addPosition(p.divide(nTotal)) 1195 positions.addPosition(p.divide(nTotal))
1271 self.positions = positions 1196 self.positions = positions
1272 1197
1273 @staticmethod 1198 @staticmethod
1274 def concatenate(obj1, obj2, num = None): 1199 def concatenate(obj1, obj2, num = None):
1275 '''Concatenates two objects supposed to overlap temporally ''' 1200 '''Concatenates two objects supposed to overlap temporally '''
1276 if num is None: 1201 if num is None:
1295 for t in emptyInterval: 1220 for t in emptyInterval:
1296 positions.addPositionXY(px,py) 1221 positions.addPositionXY(px,py)
1297 velocities.addPositionXY(vitessex,vitessey) 1222 velocities.addPositionXY(vitessex,vitessey)
1298 px+=vitessex 1223 px+=vitessex
1299 py+=vitessey 1224 py+=vitessey
1300 1225 newObject = MovingObject(newNum, emptyInterval, positions, velocities, userType = obj1.getUserType())
1301 newObject = MovingObject(newNum, emptyInterval, positions, velocities, userType = obj1.getUserType()) 1226 newObject.features = [MovingObject(newNum, emptyInterval, positions, velocities, userType = obj1.getUserType())] #In case there is features to add when we recursively call concatenate
1302 newObject.features = [MovingObject(newNum, emptyInterval, positions, velocities, userType = obj1.getUserType())] #In case there is features to add when we recursively call concatenate
1303 return MovingObject.concatenate(MovingObject.concatenate(obj1, newObject),obj2) 1227 return MovingObject.concatenate(MovingObject.concatenate(obj1, newObject),obj2)
1304 1228
1305 else: 1229 else:
1306 newTimeInterval = TimeInterval.union(obj1.getTimeInterval(), obj2.getTimeInterval()) 1230 newTimeInterval = TimeInterval.union(obj1.getTimeInterval(), obj2.getTimeInterval())
1307 # positions 1231 # positions
1308 positions = Trajectory() 1232 positions = Trajectory()
1309 for t in newTimeInterval: 1233 for t in newTimeInterval:
1310 nTotal = 0. 1234 nTotal = 0.
1311 p = Point(0.,0.) 1235 p = Point(0.,0.)
1312 for obj in [obj1, obj2]: 1236 for obj in [obj1, obj2]:
1313 if obj.existsAtInstant(t): 1237 if obj.existsAtInstant(t):
1314 if obj.hasFeatures(): 1238 if obj.hasFeatures():
1315 n = len([f for f in obj.getFeatures() if f.existsAtInstant(t)]) 1239 n = len([f for f in obj.getFeatures() if f.existsAtInstant(t)])
1316 else: 1240 else:
1317 n = 1. 1241 n = 1.
1318 p += obj.getPositionAtInstant(t).__mul__(n) 1242 p += obj.getPositionAtInstant(t).__mul__(n)
1319 nTotal += n 1243 nTotal += n
1320 assert nTotal>0, 'there should be at least one point for each instant' 1244 assert nTotal>0, 'there should be at least one point for each instant'
1321 positions.addPosition(p.divide(nTotal)) 1245 positions.addPosition(p.divide(nTotal))
1322 # velocities: if any 1246 # velocities: if any
1323 if hasattr(obj1, 'velocities') and hasattr(obj2, 'velocities'): 1247 if hasattr(obj1, 'velocities') and hasattr(obj2, 'velocities'):
1324 velocities = Trajectory() 1248 velocities = Trajectory()
1325 for t in newTimeInterval: 1249 for t in newTimeInterval:
1326 nTotal = 0. 1250 nTotal = 0.
2053 for obj in objects: 1977 for obj in objects:
2054 obj.plot(colors.get(obj.userType)) 1978 obj.plot(colors.get(obj.userType))
2055 axis('equal') 1979 axis('equal')
2056 1980
2057 1981
2058 if __name__ == "__main__": 1982 '''if __name__ == "__main__":
2059 import doctest 1983 import doctest
2060 import unittest 1984 import unittest
2061 suite = doctest.DocFileSuite('tests/moving.txt') 1985 suite = doctest.DocFileSuite('tests/moving.txt')
2062 #suite = doctest.DocTestSuite() 1986 #suite = doctest.DocTestSuite()
2063 unittest.TextTestRunner().run(suite) 1987 unittest.TextTestRunner().run(suite)
2064 #doctest.testmod() 1988 #doctest.testmod()
2065 #doctest.testfile("example.txt") 1989 #doctest.testfile("example.txt")
2066 if shapelyAvailable: 1990 if shapelyAvailable:
2067 suite = doctest.DocFileSuite('tests/moving_shapely.txt') 1991 suite = doctest.DocFileSuite('tests/moving_shapely.txt')
2068 unittest.TextTestRunner().run(suite) 1992 unittest.TextTestRunner().run(suite)
1993 for t in newTimeInterval:'''