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:
113 global sideLength, shipRadius, kouleRadius, propagationStepSize, shipAcceleration, \
114 shipRotVel, shipDelta, shipEps, path
115 sideLength, shipRadius, kouleRadius, propagationStepSize, shipAcceleration, \
116 shipRotVel, shipDelta, shipEps = [float(x)
for x
in next(f).split()]
117 path = [[float(x)
for x
in line.split(
' ')]
for line
in f]
119 print(
'Error: %s contains no solution path' % fname)
121 step = int(ceil(speedUp / (propagationStepSize * targetFrameRate)))
122 path = path[0:len(path):step]
123 print(
'Creating a movie with %d frames...' % len(path))
124 print(
'Printing a \'.\' for every 10th frame:')
125 ani = animation.FuncAnimation(fig, plotSystem, frames = len(path),
126 interval = 1000. / step, blit =
True)
127 (base,ext) = splitext(basename(fname))
128 outfname = base +
'.mp4'
129 ani.save(outfname, bitrate = 300, fps = targetFrameRate, writer=
'mencoder')
132 if __name__ ==
'__main__':
134 print(
'Usage: KoulesPlayback.py <filename> [<filename2> ...]')
136 for fname
in argv[1:]: