PageRenderTime 25ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/demos/bin/space-aliens/runtime/paths.py

http://game-baker.googlecode.com/
Python | 65 lines | 43 code | 15 blank | 7 comment | 6 complexity | 559c963934fad40a7889fcb96f989f1e MD5 | raw file
Possible License(s): LGPL-3.0
  1. from math import sqrt as sqrt
  2. from gb_exceptions import *
  3. class bezier_curve(object):
  4. def __init__(self):
  5. self.points=[]
  6. self.total_length = 0
  7. pass
  8. def length(self):
  9. """Returns actual (unparametrisized) length of curve"""
  10. return self.total_length
  11. def add_point(self,x,y):
  12. """Adds a point"""
  13. self.points.append((x,y))
  14. def get_position(self,t):
  15. """Gets unparametrisized position from parameter t"""
  16. pass
  17. class linear_bezier(bezier_curve):
  18. """Simple Linear Bezier Curves - i.e. lines between points"""
  19. def add_point(self,x,y):
  20. self.points.append((x,y))
  21. self.total_length = 0
  22. for i in range(len(self.points)-1):
  23. self.total_length += sqrt(
  24. (self.points[i][0] - self.points[i+1][0])**2 +
  25. (self.points[i][1] - self.points[i+1][1])**2
  26. )
  27. def get_position(self,t=0.):
  28. if float(t)> 1.:
  29. t = 1.
  30. # find which segment we're on
  31. i = 0
  32. length = 0.
  33. t_times_total = t*self.total_length
  34. while i < len(self.points):
  35. segment_length = sqrt(
  36. (self.points[i][0] - self.points[i+1][0])**2 +
  37. (self.points[i][1] - self.points[i+1][1])**2
  38. )
  39. if length + segment_length > t_times_total or (i+2 == len(self.points)):
  40. break
  41. else:
  42. length += segment_length
  43. i+=1
  44. # should be at the segment starting with point i
  45. # find out how far along this segment we are
  46. dist = ( t_times_total - length ) / (segment_length)
  47. vector = (self.points[i+1][0] - self.points[i][0],
  48. self.points[i+1][1] - self.points[i][1])
  49. return (self.points[i][0] + dist * vector[0],
  50. self.points[i][1] + dist * vector[1])