39 from sys
import argv, stdout
40 from os.path
import basename, splitext
41 from math
import cos, sin, atan2, pi, sqrt, ceil
42 import matplotlib.pyplot
as plt
43 from matplotlib.path
import Path
44 from matplotlib
import patches
45 import matplotlib.animation
as animation
53 propagationStepSize = 0
59 fig = plt.figure(figsize=(6, 6))
60 ax = plt.axes(xlim=(0, 1), ylim=(0, 1))
61 fig.subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=
None, hspace=
None)
62 handle, = ax.plot([], [])
65 def normalizeAngle(theta):
67 return theta + 2. * pi
69 return theta - 2. * pi
75 (cs,ss) = (shipRadius*cos(theta), shipRadius*sin(theta))
76 v = [ u[0] - x[2], u[1] - x[3] ]
77 deltaTheta = normalizeAngle(atan2(v[1], v[0]) - theta)
78 if v[0]*v[0] + v[1]*v[1] >= shipDelta * shipDelta:
79 if abs(deltaTheta) < shipEps:
81 ax.add_patch(plt.Circle((pos[0] - cs, pos[1] - ss), .3 * shipRadius, color =
"red"))
84 ax.add_patch(plt.Circle((pos[0] + ss, pos[1] - cs), .3 * shipRadius, color =
"red"))
87 ax.add_patch(plt.Circle((pos[0] - ss, pos[1] + cs), .3 * shipRadius, color =
"red"))
89 ax.add_patch(plt.Circle(x[:2], shipRadius, color =
"yellow"))
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"))
93 ax.add_patch(plt.Circle((pos[0] + .7*shipRadius*cos(theta - .75),
94 pos[1] + .7*shipRadius*sin(theta - .75)), .2 * shipRadius, color =
"blue"))
96 def plotKoules(state):
97 numKoules = int(len(state)/4)
98 for i
in range(numKoules):
99 ax.add_patch(plt.Circle((state[4 * i], state[4 * i + 1]), kouleRadius, color =
"red"))
101 def plotSystem(index):
103 ax.add_patch(plt.Rectangle((0, 0), 1, 1, color=
'black'))
104 plotKoules(path[index][5:-3])
105 plotShip(path[index][0:5], path[index][-3:])
111 def makeMovie(fname):
112 with open(fname,
'r') as f: global sideLength, shipRadius, kouleRadius, propagationStepSize, shipAcceleration, \
113 shipRotVel, shipDelta, shipEps, path
114 sideLength, shipRadius, kouleRadius, propagationStepSize, shipAcceleration, \
115 shipRotVel, shipDelta, shipEps = [float(x)
for x
in next(f).split()]
116 path = [[float(x)
for x
in line.split(
' ')]
for line
in f]
118 print(
'Error: %s contains no solution path' % fname)
120 step = int(ceil(speedUp / (propagationStepSize * targetFrameRate)))
121 path = path[0:len(path):step]
122 print(
'Creating a movie with %d frames...' % len(path))
123 print(
'Printing a \'.\' for every 10th frame:')
124 ani = animation.FuncAnimation(fig, plotSystem, frames = len(path),
125 interval = 1000. / step, blit =
True)
126 (base,ext) = splitext(basename(fname))
127 outfname = base +
'.mp4' 128 ani.save(outfname, bitrate = 300, fps = targetFrameRate)
131 if __name__ ==
'__main__':
133 print(
'Usage: KoulesPlayback.py <filename> [<filename2> ...]')
135 for fname
in argv[1:]: