# paste this code at the end of VectorFieldPlot 2.0
doc = FieldplotDocument('VFPt_capacitor-square-plate', width=800, height=600, commons=True)
l = 4.5
d = 1.5
plates = [{'x0':-l/2., 'y0':d/2., 'x1':l/2., 'y1':d/2., 'Lz':l, 'Q':1.},
{'x0':-l/2., 'y0':-d/2., 'x1':l/2., 'y1':-d/2., 'Lz':l, 'Q':-1.}]
field = Field([['charged_rect', plates[0]], ['charged_rect', plates[1]]])
def startpath(t):
# take an oval with stright lines and half-cirles around one plate
tt = (t%1) * (2 * l + pi * d)
if tt <= l*0.5:
return sc.array([tt, d])
elif tt <= l*0.5 + pi/2.*d:
phi = (tt - l*0.5) / (d/2.)
return sc.array([l*0.5 + d*0.5*sin(phi), d*0.5 + d*0.5*cos(phi)])
elif tt <= l*1.5 + pi/2.*d:
return sc.array([l - (tt - pi/2.*d), 0.])
elif tt <= l*1.5 + pi*d:
phi = (tt - l*1.5) / (d/2.)
return sc.array([-l*0.5 + d*0.5*sin(phi), d*0.5 + d*0.5*cos(phi)])
else:
return sc.array([tt - (l*2. + pi*d), d])
nlines = 22
p0list = Startpath(field, startpath).npoints(nlines)
# plot field lines
for p0 in p0list:
line = FieldLine(field, p0, directions='both')
doc.draw_line(line, arrows_style={'dist':2, 'min_arrows':1})
# plot capacitor plates
D = 0.055
lw = 0.01
nsign = nlines
plus = 'M 0,-0.02 v 0.04 M -0.02,0 h 0.04'
minus = 'M -0.02,0 h 0.04'
for p in plates:
M = 0.5 * (sc.array([p['x0'], p['y0']]) + sc.array([p['x1'], p['y1']]))
R = sc.array([p['x1'], p['y1']]) - M
a = atan2(R[1], R[0])
if p['Q'] > 0:
col = '#e22'
sign = plus
else:
col = '#45e'
sign = minus
transform = 'translate({:.6g},{:.6g})'.format(M[0], M[1])
transform += ' rotate({:.6g})'.format(degrees(a))
doc.draw_object('rect', {'x':-vabs(R)-lw/2., 'width':2*vabs(R)+lw,
'y':-D, 'height':2*D,
'style':'fill:{:s}; stroke:#000; stroke-width:{:.6g}'.format(col, lw),
'transform':transform})
for i in range(nsign):
pos = M + R * (2 * (i + 0.5) / nsign - 1)
doc.draw_object('path', {'d':sign,
'transform':'translate({:.6g},{:.6g})'.format(*pos),
'style':'fill:none; stroke:#000; stroke-width:{:.6g}; '.format(2*lw) +
'stroke-linecap:square'})
doc.write()