| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- from pysketcher import *
- R = 1 # radius of wheel
- L = 4 # distance between wheels
- H = 2 # height of vehicle body
- w_1 = 5 # position of front wheel
- xmax = w_1 + 2*L + 3*R
- drawing_tool.set_coordinate_system(xmin=0, xmax=xmax,
- ymin=-1, ymax=2*R + 3*H,
- axis=False)
- wheel1 = Circle(center=(w_1, R), radius=R)
- wheel2 = wheel1.copy()
- wheel2.translate((L,0))
- under = Rectangle(lower_left_corner=(w_1-2*R, 2*R),
- width=2*R + L + 2*R, height=H)
- over = Rectangle(lower_left_corner=(w_1, 2*R + H),
- width=2.5*R, height=1.25*H)
- wheels = Composition({'wheel1': wheel1, 'wheel2': wheel2})
- body = Composition({'under': under, 'over': over})
- vehicle = Composition({'wheels': wheels, 'body': body})
- ground = Wall(x=[R, xmax], y=[0, 0], thickness=-0.3*R)
- fig = Composition({'vehicle': vehicle, 'ground': ground})
- fig.draw() # send all figures to plotting backend
- drawing_tool.display()
- drawing_tool.savefig('tmp1.png')
- fig['vehicle']['wheels'].set_filled_curves('blue')
- fig['vehicle']['wheels'].set_linewidth(6)
- fig['vehicle']['wheels'].set_linecolor('black')
- fig['vehicle']['body']['under'].set_filled_curves('red')
- fig['vehicle']['body']['over'].set_filled_curves(pattern='/')
- fig['vehicle']['body']['over'].set_linewidth(14)
- drawing_tool.erase() # avoid drawing old and new fig on top of each other
- fig.draw()
- drawing_tool.display()
- drawing_tool.savefig('tmp2.png')
- print fig
- fig.recurse('fig')
- fig.graphviz_dot('fig', False)
- import time
- time.sleep(1)
- # Animate motion
- fig['vehicle'].translate((L,0)) # move to start point for "driving"
- def v(t):
- return -8*R*t*(1 - t/(2*R))
- import numpy
- tp = numpy.linspace(0, 2*R, 25)
- dt = tp[1] - tp[0] # time step
- def move_vehicle(t, fig):
- x_displacement = dt*v(t)
- fig['vehicle'].translate((x_displacement, 0))
- files = animate(fig, tp, move_vehicle, moviefiles=True,
- pause_per_frame=0)
- os.system('convert -delay 20 %s anim.gif' % files)
- os.system('ffmpeg -i "tmp_frame_%04d.png" -b 800k -r 25 -vcodec mpeg4 -y -qmin 2 -qmax 31 anim.mpeg')
- try:
- from scitools.std import movie
- except ImportError:
- raise ImportError(
- 'scitools must be installed for running the "movie" function.\n'
- 'scitools is installed by sudo apt-get install python-scitools\n'
- 'on Ubuntu or by sudo python setup.py install if the code is\n'
- 'downloaded from http://code.google.com/p/scitools.')
- # HTML page showing individual frames
- movie(files, encoder='html', fps=4, output_file='anim.html')
- # Standard GIF file
- movie(files, encoder='convert', fps=4, output_file='anim2.gif')
- # AVI format
- movie('tmp_*.png', encoder='ffmpeg', fps=4,
- output_file='anim.avi') # requires ffmpeg package
- # MPEG format
- movie('tmp_*.png', encoder='ffmpeg', fps=4,
- output_file='anim3.mpeg', vodec='mpeg2video')
- # or
- movie(files, encoder='ppmtompeg', fps=24,
- output_file='anim2.mpeg') # requires the netpbm package
- raw_input()
|