Mercurial > hg > nsaunier > traffic-intelligence
comparison python/moving.py @ 995:349cd5e73f79
work in progress
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Mon, 21 May 2018 22:56:58 -0400 |
| parents | 8118c6b77d7c |
| children | add667153087 |
comparison
equal
deleted
inserted
replaced
| 994:8118c6b77d7c | 995:349cd5e73f79 |
|---|---|
| 1131 self.userType = userType | 1131 self.userType = userType |
| 1132 self.features = None | 1132 self.features = None |
| 1133 # compute bounding polygon from trajectory | 1133 # compute bounding polygon from trajectory |
| 1134 | 1134 |
| 1135 @staticmethod | 1135 @staticmethod |
| 1136 def aggregateTrajectory(features, aggFunc = np.mean): | |
| 1137 'Computes the aggregate trajectory from list of MovingObject features' | |
| 1138 return None | |
| 1139 | |
| 1140 @staticmethod | |
| 1136 def generate(num, p, v, timeInterval): | 1141 def generate(num, p, v, timeInterval): |
| 1137 positions, velocities = Trajectory.generate(p, v, int(timeInterval.length())) | 1142 positions, velocities = Trajectory.generate(p, v, int(timeInterval.length())) |
| 1138 return MovingObject(num = num, timeInterval = timeInterval, positions = positions, velocities = velocities) | 1143 return MovingObject(num = num, timeInterval = timeInterval, positions = positions, velocities = velocities) |
| 1139 | 1144 |
| 1140 @staticmethod | 1145 @staticmethod |
| 1141 def concatenate(obj1, obj2, num = None): | 1146 def concatenate(obj1, obj2, num = None, computePositions = False): |
| 1142 '''Concatenates two objects supposed to overlap temporally ''' | 1147 '''Concatenates two objects supposed to overlap temporally ''' |
| 1143 if num is None: | 1148 if num is None: |
| 1144 newNum = obj1.getNum() | 1149 newNum = obj1.getNum() |
| 1145 else: | 1150 else: |
| 1146 newNum = num | 1151 newNum = num |
| 1170 | 1175 |
| 1171 | 1176 |
| 1172 else: | 1177 else: |
| 1173 newTimeInterval = TimeInterval.union(obj1.getTimeInterval(), obj2.getTimeInterval()) | 1178 newTimeInterval = TimeInterval.union(obj1.getTimeInterval(), obj2.getTimeInterval()) |
| 1174 # positions | 1179 # positions |
| 1175 positions = Trajectory() | 1180 if computePositions: # TODO it would probably be better to recompute from all features, if features are available, in other method |
| 1176 for t in newTimeInterval: | 1181 positions = Trajectory() |
| 1177 nTotal = 0. | |
| 1178 p = Point(0.,0.) | |
| 1179 for obj in [obj1, obj2]: | |
| 1180 if obj.existsAtInstant(t): | |
| 1181 if obj.hasFeatures(): | |
| 1182 n = len([f for f in obj.getFeatures() if f.existsAtInstant(t)]) | |
| 1183 else: | |
| 1184 n = 1. | |
| 1185 p += obj.getPositionAtInstant(t).__mul__(n) | |
| 1186 nTotal += n | |
| 1187 assert nTotal>0, 'there should be at least one point for each instant' | |
| 1188 positions.addPosition(p.divide(nTotal)) | |
| 1189 # velocities: if any | |
| 1190 if hasattr(obj1, 'velocities') and hasattr(obj2, 'velocities'): | |
| 1191 velocities = Trajectory() | |
| 1192 for t in newTimeInterval: | 1182 for t in newTimeInterval: |
| 1193 nTotal = 0. | 1183 nTotal = 0. |
| 1194 p = Point(0.,0.) | 1184 p = Point(0.,0.) |
| 1195 for obj in [obj1, obj2]: | 1185 for obj in [obj1, obj2]: |
| 1196 if obj.existsAtInstant(t): | 1186 if obj.existsAtInstant(t): |
| 1197 if obj.hasFeatures(): | 1187 if obj.hasFeatures(): |
| 1198 n = len([f for f in obj.getFeatures() if f.existsAtInstant(t)]) | 1188 n = len([f for f in obj.getFeatures() if f.existsAtInstant(t)]) |
| 1199 else: | 1189 else: |
| 1200 n = 1. | 1190 n = 1. |
| 1201 p += obj.getVelocityAtInstant(t).__mul__(n) | 1191 p += obj.getPositionAtInstant(t).__mul__(n) |
| 1202 nTotal += n | 1192 nTotal += n |
| 1203 assert n>0, 'there should be at least one point for each instant' | 1193 assert nTotal>0, 'there should be at least one point for each instant' |
| 1204 velocities.addPosition(p.divide(nTotal)) | 1194 positions.addPosition(p.divide(nTotal)) |
| 1195 # velocities: if any | |
| 1196 if obj1.getVelocities() is not None and obj2.getVelocities() is not None: | |
| 1197 velocities = Trajectory() | |
| 1198 for t in newTimeInterval: | |
| 1199 nTotal = 0. | |
| 1200 p = Point(0.,0.) | |
| 1201 for obj in [obj1, obj2]: | |
| 1202 if obj.existsAtInstant(t): | |
| 1203 if obj.hasFeatures(): | |
| 1204 n = len([f for f in obj.getFeatures() if f.existsAtInstant(t)]) | |
| 1205 else: | |
| 1206 n = 1. | |
| 1207 p += obj.getVelocityAtInstant(t).__mul__(n) | |
| 1208 nTotal += n | |
| 1209 assert n>0, 'there should be at least one point for each instant' | |
| 1210 velocities.addPosition(p.divide(nTotal)) | |
| 1211 else: | |
| 1212 velocities = None | |
| 1205 else: | 1213 else: |
| 1214 positions = None | |
| 1206 velocities = None | 1215 velocities = None |
| 1207 # TODO object envelop (polygon) | 1216 # TODO object envelop (polygon) |
| 1208 # user type | 1217 # user type |
| 1209 if obj1.getUserType() != obj2.getUserType(): | 1218 if obj1.getUserType() != obj2.getUserType(): |
| 1210 print('The two moving objects have different user types: obj1 {} obj2 {}'.format(userTypeNames[obj1.getUserType()], userTypeNames[obj2.getUserType()])) | 1219 print('The two moving objects have different user types: obj1 {} obj2 {}'.format(userTypeNames[obj1.getUserType()], userTypeNames[obj2.getUserType()])) |
| 1211 | 1220 |
| 1212 newObject = MovingObject(newNum, newTimeInterval, positions, velocities, userType = obj1.getUserType()) | 1221 newObject = MovingObject(newNum, newTimeInterval, positions, velocities, userType = obj1.getUserType()) |
| 1222 if hasattr(obj1, 'featureNumbers') and hasattr(obj2, 'featureNumbers'): | |
| 1223 newObject.featureNumbers = obj1.featureNumbers+obj2.featureNumbers | |
| 1213 if obj1.hasFeatures() and obj2.hasFeatures(): | 1224 if obj1.hasFeatures() and obj2.hasFeatures(): |
| 1214 newObject.features = obj1.getFeatures()+obj2.getFeatures() | 1225 newObject.features = obj1.getFeatures()+obj2.getFeatures() |
| 1215 return newObject | 1226 return newObject |
| 1216 | 1227 |
| 1217 def getObjectInTimeInterval(self, inter): | 1228 def getObjectInTimeInterval(self, inter): |
