39 from sys
import argv, stdout
40 from os.path
import basename, splitext
41 from math
import cos, sin, atan2, pi, ceil
42 import matplotlib.pyplot
as plt
43 import matplotlib.animation
as animation
51 propagationStepSize = 0
57 fig = plt.figure(figsize=(6, 6))
58 ax = plt.axes(xlim=(0, 1), ylim=(0, 1))
59 fig.subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=
None, hspace=
None)
60 handle, = ax.plot([], [])
63 def 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"))
94 def plotKoules(state):
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"))
99 def plotSystem(index):
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:])
109 def makeMovie(fname):
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)
130 if __name__ ==
'__main__':
132 print(
'Usage: KoulesPlayback.py <filename> [<filename2> ...]')
134 for trajectory_file
in argv[1:]:
135 makeMovie(trajectory_file)