39from sys
import argv, stdout
40from os.path
import basename, splitext
41from math
import cos, sin, atan2, pi, ceil
42import matplotlib.pyplot
as plt
43import matplotlib.animation
as animation
51propagationStepSize = 0
57fig = plt.figure(figsize=(6, 6))
58ax = plt.axes(xlim=(0, 1), ylim=(0, 1))
59fig.subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=
None, hspace=
None)
60handle, = ax.plot([], [])
63def normalizeAngle(theta):
65 return theta + 2. * pi
67 return theta - 2. * pi
73 (cs, ss) = (shipRadius*cos(theta), shipRadius * sin(theta))
74 v = [u[0] - x[2], u[1] - x[3]]
75 deltaTheta = normalizeAngle(atan2(v[1], v[0]) - theta)
76 if v[0]*v[0] + v[1]*v[1] >= shipDelta * shipDelta:
77 if abs(deltaTheta) < shipEps:
79 ax.add_patch(plt.Circle((pos[0] - cs, pos[1] - ss), .3 * shipRadius, color=
"red"))
82 ax.add_patch(plt.Circle((pos[0] + ss, pos[1] - cs), .3 * shipRadius, color=
"red"))
85 ax.add_patch(plt.Circle((pos[0] - ss, pos[1] + cs), .3 * shipRadius, color=
"red"))
87 ax.add_patch(plt.Circle(x[:2], shipRadius, color=
"yellow"))
89 ax.add_patch(plt.Circle((pos[0] + .7*shipRadius*cos(theta + .75), \
90 pos[1] + .7*shipRadius*sin(theta + .75)), .2 * shipRadius, color=
"blue"))
91 ax.add_patch(plt.Circle((pos[0] + .7*shipRadius*cos(theta - .75), \
92 pos[1] + .7*shipRadius*sin(theta - .75)), .2 * shipRadius, color=
"blue"))
95 numKoules = int(len(state)/4)
96 for i
in range(numKoules):
97 ax.add_patch(plt.Circle((state[4 * i], state[4 * i + 1]), kouleRadius, color=
"red"))
101 ax.add_patch(plt.Rectangle((0, 0), 1, 1, color=
'black'))
102 plotKoules(path[index][5:-3])
103 plotShip(path[index][0:5], path[index][-3:])
110 with open(fname,
'r')
as f:
111 global sideLength, shipRadius, kouleRadius, propagationStepSize, shipAcceleration, \
112 shipRotVel, shipDelta, shipEps, path
113 sideLength, shipRadius, kouleRadius, propagationStepSize, shipAcceleration, \
114 shipRotVel, shipDelta, shipEps = [float(x)
for x
in next(f).split()]
115 path = [[float(x)
for x
in line.split(
' ')]
for line
in f]
117 print(
'Error: %s contains no solution path' % fname)
119 step = int(ceil(speedUp / (propagationStepSize * targetFrameRate)))
120 path = path[0:len(path):step]
121 print(
'Creating a movie with %d frames...' % len(path))
122 print(
'Printing a \'.\' for every 10th frame:')
123 ani = animation.FuncAnimation(fig, plotSystem, frames=len(path), \
124 interval=1000. / step, blit=
True)
125 (base, _) = splitext(basename(fname))
126 outfname = base +
'.mp4'
127 ani.save(outfname, bitrate=300, fps=targetFrameRate)
130if __name__ ==
'__main__':
132 print(
'Usage: KoulesPlayback.py <filename> [<filename2> ...]')
134 for trajectory_file
in argv[1:]:
135 makeMovie(trajectory_file)