diff python/moving.py @ 250:59f547aebaac

modified prediction functions, added norm/angle representation of Points
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Mon, 23 Jul 2012 02:50:26 -0400
parents 99173da7afae
children 13ec22bec5d4
line wrap: on
line diff
--- a/python/moving.py	Sat Jul 21 00:50:42 2012 -0400
+++ b/python/moving.py	Mon Jul 23 02:50:26 2012 -0400
@@ -228,10 +228,43 @@
         from matplotlib.pyplot import scatter
         scatter([p.x for p in points],[p.y for p in points], c=color)
 
+class NormAngle:
+    'alternate encoding of a point, by its norm and orientation'
 
-def predictPosition(nTimeSteps, initialPosition, initialVelocity, initialAcceleration = Point(0,0)):
+    def __init__(self, norm, angle):
+        self.norm = norm
+        self.angle = angle
+    
+    @staticmethod
+    def fromPoint(p):
+        from math import atan2
+        norm = p.norm2()
+        if norm > 0:
+            angle = atan2(p.x, p.y)
+        return NormAngle(norm, angle)
+
+    def __add__(self, other):
+        'a norm cannot become negative'
+        return NormAngle(max(self.norm+other.norm, 0), self.orientation+other.orientation)
+
+    def getPoint(self):
+        from math import cos, sin
+        return Point(self.norm*cos(self.orientation), self.norm*sin(self.orientation))
+
+
+def predictPositionNoLimit(nTimeSteps, initialPosition, initialVelocity, initialAcceleration = Point(0,0)):
     '''Predicts the position in nTimeSteps at constant speed/acceleration'''
-    return initialPosition+initialVelocity.multiply(nTimeSteps) + initialAcceleration.multiply(nTimeSteps**2)
+    return initialVelocity + initialAcceleration.multiply(nTimeSteps),initialPosition+initialVelocity.multiply(nTimeSteps) + initialAcceleration.multiply(nTimeSteps**2*0.5)
+
+def predictPosition(position, speedOrientation, control, maxSpeed = None):
+    '''Predicts the position (moving.Point) at the next time step with given control input (deltaSpeed, deltaTheta)
+    speedOrientation is the other encoding of velocity, (speed, orientation)
+    speedOrientation and control are NormAngle'''
+    predictedSpeedTheta = speedOrientation+control
+    if maxSpeed:
+         predictedSpeedTheta.norm = min(predictedSpeedTheta.norm, maxSpeed)
+    predictedPosition = position+predictedSpeedTheta.getPoint()
+    return predictedPosition, predictedSpeedTheta
 
 
 class FlowVector: