comparison trafficintelligence/moving.py @ 1109:6e8ab471ebd4

minor adjustment to Lionel s needs
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Tue, 16 Apr 2019 11:58:23 -0400
parents 799ef82caa1a
children 6bbcd9433732
comparison
equal deleted inserted replaced
1108:77ce1cb3c868 1109:6e8ab471ebd4
261 e2 = e1.orthogonal(clockwise) 261 e2 = e1.orthogonal(clockwise)
262 return Point(Point.dot(self, e1), Point.dot(self, e2)) 262 return Point(Point.dot(self, e1), Point.dot(self, e2))
263 263
264 def rotate(self, theta): 264 def rotate(self, theta):
265 return Point(self.x*cos(theta)-self.y*sin(theta), self.x*sin(theta)+self.y*cos(theta)) 265 return Point(self.x*cos(theta)-self.y*sin(theta), self.x*sin(theta)+self.y*cos(theta))
266 266
267 def plot(self, options = 'o', **kwargs): 267 def plot(self, options = 'o', **kwargs):
268 plot([self.x], [self.y], options, **kwargs) 268 plot([self.x], [self.y], options, **kwargs)
269 269
270 @staticmethod 270 @staticmethod
271 def plotSegment(p1, p2, options = 'o', **kwargs): 271 def plotSegment(p1, p2, options = 'o', **kwargs):
355 def distanceNorm2(p1, p2): 355 def distanceNorm2(p1, p2):
356 return (p1-p2).norm2() 356 return (p1-p2).norm2()
357 357
358 @staticmethod 358 @staticmethod
359 def plotAll(points, options = '', **kwargs): 359 def plotAll(points, options = '', **kwargs):
360 plot([p.x for p in points],[p.y for p in points], options, **kwargs) 360 plot([p.x for p in points], [p.y for p in points], options, **kwargs)
361 361
362 def similarOrientation(self, refDirection, cosineThreshold): 362 def similarOrientation(self, refDirection, cosineThreshold):
363 'Indicates whether the cosine of the vector and refDirection is smaller than cosineThreshold' 363 'Indicates whether the cosine of the vector and refDirection is smaller than cosineThreshold'
364 return Point.cosine(self, refDirection) >= cosineThreshold 364 return Point.cosine(self, refDirection) >= cosineThreshold
365 365
418 frontLeft = Point(xmax, ymin) 418 frontLeft = Point(xmax, ymin)
419 frontRight = Point(xmax, ymax) 419 frontRight = Point(xmax, ymax)
420 rearLeft = Point(xmin, ymin) 420 rearLeft = Point(xmin, ymin)
421 rearRight = Point(xmin, ymax) 421 rearRight = Point(xmin, ymax)
422 return [Point(Point.dot(e1, p), Point.dot(e2, p)) for p in [frontLeft, frontRight, rearRight, rearLeft]] 422 return [Point(Point.dot(e1, p), Point.dot(e2, p)) for p in [frontLeft, frontRight, rearRight, rearLeft]]
423 423
424 if shapelyAvailable: 424 if shapelyAvailable:
425 def pointsInPolygon(points, polygon): 425 def pointsInPolygon(points, polygon):
426 '''Optimized tests of a series of points within (Shapely) polygon (not prepared)''' 426 '''Optimized tests of a series of points within (Shapely) polygon (not prepared)'''
427 if type(polygon) == PreparedGeometry: 427 if type(polygon) == PreparedGeometry:
428 prepared_polygon = polygon 428 prepared_polygon = polygon
530 i += 1 530 i += 1
531 if i < len(alignment): 531 if i < len(alignment):
532 d = s - alignment.getCumulativeDistance(i-1) # distance on subsegment 532 d = s - alignment.getCumulativeDistance(i-1) # distance on subsegment
533 #Get difference vector and then snap 533 #Get difference vector and then snap
534 dv = alignment[i] - alignment[i-1] 534 dv = alignment[i] - alignment[i-1]
535 #magnitude = dv.norm2()
536 normalizedV = dv.normalize() 535 normalizedV = dv.normalize()
537 #snapped = alignment[i-1] + normalizedV*d # snapped point coordinate along alignment 536 #snapped = alignment[i-1] + normalizedV*d # snapped point coordinate along alignment
538 # add offset finally 537 # add offset finally
539 orthoNormalizedV = normalizedV.orthogonal() 538 orthoNormalizedV = normalizedV.orthogonal()
540 return alignment[i-1] + normalizedV*d + orthoNormalizedV*y 539 return alignment[i-1] + normalizedV*d + orthoNormalizedV*y
966 ratio = 0 965 ratio = 0
967 indices.append(i+ratio) 966 indices.append(i+ratio)
968 intersections.append(p) 967 intersections.append(p)
969 return indices, intersections 968 return indices, intersections
970 969
971 def getTrajectoryInInterval(self, inter): 970 def subTrajectoryInInterval(self, inter):
972 'Returns all position between index inter.first and index.last (included)' 971 'Returns all position between index inter.first and index.last (included)'
973 if inter.first >=0 and inter.last<= self.length(): 972 if inter.first >=0 and inter.last<= self.length():
974 return Trajectory([self.positions[0][inter.first:inter.last+1], 973 return Trajectory([self.positions[0][inter.first:inter.last+1],
975 self.positions[1][inter.first:inter.last+1]]) 974 self.positions[1][inter.first:inter.last+1]])
976 else: 975 else:
1145 def getYCoordAt(self, i): 1144 def getYCoordAt(self, i):
1146 return self.positions[1][i] 1145 return self.positions[1][i]
1147 1146
1148 def getLaneAt(self, i): 1147 def getLaneAt(self, i):
1149 return self.lanes[i] 1148 return self.lanes[i]
1149
1150 def subTrajectoryInInterval(self, inter):
1151 'Returns all curvilinear positions between index inter.first and index.last (included)'
1152 if inter.first >=0 and inter.last<= self.length():
1153 return CurvilinearTrajectory(self.positions[0][inter.first:inter.last+1],
1154 self.positions[1][inter.first:inter.last+1],
1155 self.lanes[inter.first:inter.last+1])
1156 else:
1157 return None
1150 1158
1151 def addPositionSYL(self, s, y, lane = None): 1159 def addPositionSYL(self, s, y, lane = None):
1152 self.addPositionXY(s,y) 1160 self.addPositionXY(s,y)
1153 self.lanes.append(lane) 1161 self.lanes.append(lane)
1154 1162
1723 if not hasattr(self, 'prototypeSimilarities'): 1731 if not hasattr(self, 'prototypeSimilarities'):
1724 self.prototypeSimilarities = [] 1732 self.prototypeSimilarities = []
1725 for proto in prototypes: 1733 for proto in prototypes:
1726 lcss.similarities(proto.getMovingObject().getPositions().asArray().T, self.getPositions().asArray().T) 1734 lcss.similarities(proto.getMovingObject().getPositions().asArray().T, self.getPositions().asArray().T)
1727 similarities = lcss.similarityTable[-1, :-1].astype(float) 1735 similarities = lcss.similarityTable[-1, :-1].astype(float)
1728 self.prototypeSimilarities.append(similarities/minimum(arange(1.,len(similarities)+1), proto.getMovingObject().length()*ones(len(similarities)))) 1736 self.prototypeSimilarities.append(similarities/minimum(arange(1., len(similarities)+1), proto.getMovingObject().length()*ones(len(similarities))))
1729 1737
1730 @staticmethod 1738 @staticmethod
1731 def computePET(obj1, obj2, collisionDistanceThreshold): 1739 def computePET(obj1, obj2, collisionDistanceThreshold):
1732 '''Post-encroachment time based on distance threshold 1740 '''Post-encroachment time based on distance threshold
1733 1741
1793 positions = [f.getPositionAtInstant(instant) for f in self.getFeatures() if f.existsAtInstant(instant)] 1801 positions = [f.getPositionAtInstant(instant) for f in self.getFeatures() if f.existsAtInstant(instant)]
1794 return Point.boundingRectangle(positions, self.getVelocityAtInstant(instant)) 1802 return Point.boundingRectangle(positions, self.getVelocityAtInstant(instant))
1795 else: 1803 else:
1796 print('Object {} has no features'.format(self.getNum())) 1804 print('Object {} has no features'.format(self.getNum()))
1797 return None 1805 return None
1798 1806
1799 ### 1807 ###
1800 # User Type Classification 1808 # User Type Classification
1801 ### 1809 ###
1802 def classifyUserTypeSpeedMotorized(self, threshold, aggregationFunc = median, nInstantsIgnoredAtEnds = 0): 1810 def classifyUserTypeSpeedMotorized(self, threshold, aggregationFunc = median, nInstantsIgnoredAtEnds = 0):
1803 '''Classifies slow and fast road users 1811 '''Classifies slow and fast road users