comparison python/moving.py @ 1018:d7afc59f6966

work in progress
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Mon, 04 Jun 2018 17:46:52 -0400
parents 9b53be469a36
children 5d2f6afae35b
comparison
equal deleted inserted replaced
1017:89cbc4056c13 1018:d7afc59f6966
1161 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)
1162 newObject.features = [copy.deepcopy(f) for f in features] 1162 newObject.features = [copy.deepcopy(f) for f in features]
1163 return newObject 1163 return newObject
1164 1164
1165 @staticmethod 1165 @staticmethod
1166 def concatenateWith(obj1, ObjectList=[], num = None): #Concatenate with a list of MovingObjects 1166 def concatenateWith(obj1, ObjectList=[], num = None):
1167 if len(ObjectList)==0: 1167 if len(ObjectList)==0:
1168 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())
1169 if obj1.hasFeatures() : 1169 if obj1.hasFeatures() :
1170 newObject.features = list(obj1.features) 1170 newObject.features = list(obj1.features)
1171 else: 1171 else:
1194 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'
1195 positions.addPosition(p.divide(nTotal)) 1195 positions.addPosition(p.divide(nTotal))
1196 self.positions = positions 1196 self.positions = positions
1197 1197
1198 @staticmethod 1198 @staticmethod
1199 def concatenate(obj1, obj2, num = None): 1199 def concatenate(obj1, obj2, num = None, computePositions = False):
1200 '''Concatenates two objects supposed to overlap temporally ''' 1200 '''Concatenates two objects, whether overlapping temporally or not
1201
1202 Positions will be recomputed only if computePositions is True
1203 Otherwise, only featureNumbers and/or features will be merged'''
1201 if num is None: 1204 if num is None:
1202 newNum = obj1.getNum() 1205 newNum = obj1.getNum()
1203 else: 1206 else:
1204 newNum = num 1207 newNum = num
1205 commonTimeInterval = obj1.commonTimeInterval(obj2) 1208 commonTimeInterval = obj1.commonTimeInterval(obj2)
1206 if commonTimeInterval.empty(): 1209 if commonTimeInterval.empty():
1207 print('The two objects\' time intervals do not overlap: obj1 {} and obj2 {}'.format(obj1.getTimeInterval(), obj2.getTimeInterval())) 1210 #print('The two objects\' time intervals do not overlap: obj1 {} and obj2 {}'.format(obj1.getTimeInterval(), obj2.getTimeInterval()))
1208 emptyInterval = TimeInterval(min(obj1.getLastInstant(),obj2.getLastInstant()) , max(obj1.getFirstInstant(),obj2.getFirstInstant())) 1211 emptyInterval = TimeInterval(min(obj1.getLastInstant(),obj2.getLastInstant()), max(obj1.getFirstInstant(),obj2.getFirstInstant()))
1209 positions = Trajectory()
1210 if obj1.existsAtInstant(emptyInterval.last): 1212 if obj1.existsAtInstant(emptyInterval.last):
1211 vitessex=(obj1.getPositionAtInstant(emptyInterval.last).x-obj2.getPositionAtInstant(emptyInterval.first).x)/(emptyInterval.last-emptyInterval.first) 1213 firstObject = obj2
1212 vitessey=(obj1.getPositionAtInstant(emptyInterval.last).y-obj2.getPositionAtInstant(emptyInterval.first).y)/(emptyInterval.last-emptyInterval.first) 1214 secondObject = obj1
1213 px,py=obj2.getPositionAtInstant(emptyInterval.first) 1215 else:
1214 else : 1216 firstObject = obj1
1215 vitessex=(obj2.getPositionAtInstant(emptyInterval.last).x-obj1.getPositionAtInstant(emptyInterval.first).x)/(emptyInterval.last-emptyInterval.first) 1217 secondObject = obj2
1216 vitessey=(obj2.getPositionAtInstant(emptyInterval.last).y-obj1.getPositionAtInstant(emptyInterval.first).y)/(emptyInterval.last-emptyInterval.first) 1218 v = (secondObject.getPositionAtInstant(emptyInterval.last)-firstObject.getPositionAtInstant(emptyInterval.first)).divide(emptyInterval.length())
1217 px,py=obj1.getPositionAtInstant(emptyInterval.first) 1219 positions = copy.deepcopy(firstObject.getPositions())
1218 positions = Trajectory() 1220 velocities = copy.deepcopy(firstObject.getPositions())
1219 velocities = Trajectory() 1221 featurePositions = Trajectory()
1220 for t in emptyInterval: 1222 featureVelocities = Trajectory()
1221 positions.addPositionXY(px,py) 1223 #newFeature = MovingObject(-1, TimeInterval(emptyInterval.first+1, emptyInterval.last-1))# what feature number to choose?
1222 velocities.addPositionXY(vitessex,vitessey) 1224 p = firstObject.getPositionAtInstant(emptyInterval.first)+v
1223 px+=vitessex 1225 for t in range(emptyInterval.first+1, emptyInterval.last):
1224 py+=vitessey 1226 positions.addPosition(p)
1227 velocities.addPosition(v)
1228 featurePositions.addPosition(p)
1229 featureVelocities.addPosition(v)
1230 p=p+v
1231 # continue
1225 newObject = MovingObject(newNum, emptyInterval, positions, velocities, userType = obj1.getUserType()) 1232 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 1233 newObject.features = [MovingObject(newNum, emptyInterval, positions, velocities, userType = obj1.getUserType())] #In case there is features to add when we recursively call concatenate
1227 return MovingObject.concatenate(MovingObject.concatenate(obj1, newObject),obj2) 1234 return MovingObject.concatenate(MovingObject.concatenate(obj1, newObject),obj2)
1228 else: 1235 else:
1229 newTimeInterval = TimeInterval.union(obj1.getTimeInterval(), obj2.getTimeInterval()) 1236 newTimeInterval = TimeInterval.union(obj1.getTimeInterval(), obj2.getTimeInterval())
1258 nTotal += n 1265 nTotal += n
1259 assert nTotal>0, 'there should be at least one point for each instant' 1266 assert nTotal>0, 'there should be at least one point for each instant'
1260 velocities.addPosition(p.divide(nTotal)) 1267 velocities.addPosition(p.divide(nTotal))
1261 else: 1268 else:
1262 velocities = None 1269 velocities = None
1263 # TODO object envelop (polygon) 1270 # user type
1264 # user type 1271 if obj1.getUserType() != obj2.getUserType():
1265 if obj1.getUserType() != obj2.getUserType(): 1272 print('The two moving objects have different user types: obj1 {} obj2 {}'.format(userTypeNames[obj1.getUserType()], userTypeNames[obj2.getUserType()]))
1266 print('The two moving objects have different user types: obj1 {} obj2 {}'.format(userTypeNames[obj1.getUserType()], userTypeNames[obj2.getUserType()])) 1273
1267 1274 newObject = MovingObject(newNum, newTimeInterval, positions, velocities, userType = obj1.getUserType())
1268 newObject = MovingObject(newNum, newTimeInterval, positions, velocities, userType = obj1.getUserType()) 1275 if hasattr(obj1, 'featureNumbers') and hasattr(obj2, 'featureNumbers'):
1269 if obj1.hasFeatures() and obj2.hasFeatures(): 1276 newObject.featureNumbers = obj1.featureNumbers+obj2.featureNumbers
1270 newObject.features = obj1.getFeatures()+obj2.getFeatures() 1277 if obj1.hasFeatures() and obj2.hasFeatures():
1271 return newObject 1278 newObject.features = obj1.getFeatures()+obj2.getFeatures()
1279 return newObject
1272 1280
1273 def getObjectInTimeInterval(self, inter): 1281 def getObjectInTimeInterval(self, inter):
1274 '''Returns a new object extracted from self, 1282 '''Returns a new object extracted from self,
1275 restricted to time interval inter''' 1283 restricted to time interval inter'''
1276 intersection = TimeInterval.intersection(inter, self.getTimeInterval()) 1284 intersection = TimeInterval.intersection(inter, self.getTimeInterval())