shmups. It provides a routine to check whether two moving circles
collided during the past frame.
-If Pyrex was available when installing, this will used optimized
-versions of the functions.
+An equivalent C-based version will be used automatically if it was
+compiled and installed with the module. If available, it will be noted
+in the docstrings for the functions.
Basic Usage:
dx = a.x - b.x
dy = a.y - b.y
- radius = getattr(a, 'radius', 0.5) + getattr(b, 'radius', 0.5)
+ try:
+ radius = a.radius + b.radius
+ except AttributeError:
+ radius = getattr(a, 'radius', 0.5) + getattr(b, 'radius', 0.5)
return dx * dx + dy * dy <= radius * radius
yb = b.y
# Treat b as a point, we only need one radius.
- radius = getattr(a, 'radius', 0.5) + getattr(b, 'radius', 0.5)
+ try:
+ radius = a.radius + b.radius
+ except AttributeError:
+ radius = getattr(a, 'radius', 0.5) + getattr(b, 'radius', 0.5)
# Previous frame locations.
- pxa = getattr(a, 'px', xa)
- pya = getattr(a, 'py', ya)
- pxb = getattr(b, 'px', xb)
- pyb = getattr(b, 'py', yb)
+ try: pxa = a.px
+ except KeyError: pxa = xa
+ try: pya = a.py
+ except KeyError: pya = ya
+ try: pxb = b.px
+ except KeyError: pxb = xb
+ try: pyb = b.py
+ except KeyError: pyb = yb
# Translate b's final position to be relative to a's start.
# And now, circle/line collision.
dir_x = pxa + (xb - xa) - pxb
dir_y = pya + (yb - ya) - pyb
- if abs(dir_x) < 0.0001 and abs(dir_y) < 0.0001:
- # b did not move relative to a, so do point/circle.
- dx = pxb - pxa
- dy = pyb - pya
- return dx * dx + dy * dy < radius * radius
-
diff_x = pxa - pxb
diff_y = pya - pyb
+ if (dir_x < 0.0001 and dir_x > -0.0001
+ and dir_y < 0.0001 and dir_y > -0.0001):
+ # b did not move relative to a, so do point/circle.
+ return diff_x * diff_x + diff_y * diff_y < radius * radius
# dot(diff, dir) / dot(dir, dir)
t = (diff_x * dir_x + diff_y * dir_y) / (dir_x * dir_x + dir_y * dir_y)