# 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()