# paste this code at the end of VectorFieldPlot 3.0
doc = FieldplotDocument('VFPt_horseshoe-magnet', commons=True,
width=600, height=600)
x0, y0 = 0.0, -1.0
h = 2.0
R = 1.0
r = 0.3
# Note: The H-field of a magnet with constant profile and magnetization
# is exactly equal to the one created by magnetic surface charges
# at the ends of the magnet. In this case the ends are round discs.
field = Field([
['charged_disc', {'x0':x0-R-r, 'y0':y0+h, 'x1':x0-R+r, 'y1':y0+h, 'Q':-1}],
['charged_disc', {'x0':x0+R-r, 'y0':y0+h, 'x1':x0+R+r, 'y1':y0+h, 'Q':1}] ])
nlines = 24
def startp(t):
return sc.array([x0 + R - R*cos(t*2*pi), y0 + h + R*sin(t*2*pi)])
startpoints = Startpath(field, startp).npoints(nlines)
for iline, p0 in enumerate(startpoints):
line = FieldLine(field, p0, directions='both', maxr=1000)
fe = {'start':True, 'leave_image':False, 'enter_image':False, 'end':True}
if iline in [0, 1, 2, nlines-1, nlines-2, nlines-3]:
fe['start'] = fe['end'] = False
min_arrows = 1
if iline == nlines - 7:
min_arrows = 3
doc.draw_line(line, arrows_style={
'dist':2.0, 'fixed_ends':fe, 'min_arrows':min_arrows})
# draw a horseshoe magnet with color gradients
g = doc.draw_object('g', {'id':'horseshoe',
'transform':'translate({},{})'.format(x0, y0)})
defs = doc.draw_object('defs', {}, group=g)
grad_col = ['#000000', '#ffffff', '#ffffff', '#ffffff', '#000000']
grad_offs = sc.array([0, 0.07, 0.25, 0.6, 1])
grad_opa = sc.array([0.125, 0.125, 0.5, 0.2, 0.33])
grad1 = doc.draw_object('linearGradient', {'id':'grad1', 'x1':'0',
'x2':'1', 'y1':'0', 'y2':'0', 'gradientUnits':'objectBoundingBox'},
group=defs)
for col, of, opa in zip(grad_col, grad_offs, grad_opa):
stop = doc.draw_object('stop', {'stop-color':col, 'offset':of,
'stop-opacity':opa}, group=grad1)
grad2 = doc.draw_object('radialGradient', {'id':'grad2', 'r':str(R+r),
'cx':'0', 'cy':'0', 'fx':'0', 'fy':'0',
'gradientUnits':'userSpaceOnUse'}, group=defs)
for col, of, opa in sorted(zip(grad_col, 1-grad_offs*2.*r/(R+r), grad_opa),
key=lambda x: x[1]):
stop = doc.draw_object('stop', {'stop-color':col, 'offset':of,
'stop-opacity':opa}, group=grad2)
grad3 = doc.draw_object('radialGradient', {'id':'grad3', 'r':str(R+r),
'cx':'0', 'cy':'0', 'fx':'0', 'fy':'0',
'gradientUnits':'userSpaceOnUse'}, group=defs)
for col, of, opa in zip(grad_col, (R-r)/(R+r)+grad_offs*2.*r/(R+r), grad_opa):
stop = doc.draw_object('stop', {'stop-color':col, 'offset':of,
'stop-opacity':opa}, group=grad3)
grad4 = doc.draw_object('linearGradient', {'id':'grad4', 'x1':str(-R-r),
'x2':str(R+r), 'y1':'0', 'y2':'0', 'gradientUnits':'userSpaceOnUse'},
group=defs)
for col, of, opa in [['#ffffff', '0', '1'], ['#ffffff', str(r/(R+r)), '1'],
['#ffffff', str(R/(R+r)), '0'], ['#ffffff', '1', '0']]:
stop = doc.draw_object('stop', {'stop-color':col, 'offset':of,
'stop-opacity':opa}, group=grad4)
mask4 = doc.draw_object('mask', {'id':'mask4', 'maskContentUnits':'userSpaceOnUse'}, group=defs)
doc.draw_object('rect', {'x':str(-R-r), 'y':str(-R-r), 'width':str(2*(R+r)),
'height':str(R+r), 'style':'fill:url(#grad4); stroke:none;'}, group=mask4)
grad5 = doc.draw_object('linearGradient', {'id':'grad5', 'x1':str(-R-r),
'x2':str(R+r), 'y1':'0', 'y2':'0', 'gradientUnits':'userSpaceOnUse'},
group=defs)
for col, of, opa in [['#ffffff', '0', '0'], ['#ffffff', str(r/(R+r)), '0'],
['#ffffff', str(R/(R+r)), '1'], ['#ffffff', '1', '1']]:
stop = doc.draw_object('stop', {'stop-color':col, 'offset':of,
'stop-opacity':opa}, group=grad5)
mask5 = doc.draw_object('mask', {'id':'mask5', 'maskContentUnits':'userSpaceOnUse'}, group=defs)
doc.draw_object('rect', {'x':str(-R-r), 'y':str(-R-r), 'width':str(2*(R+r)),
'height':str(R+r), 'style':'fill:url(#grad5); stroke:none;'}, group=mask5)
d = ('M {},{} L {},{} L {},{} A {},{} {} {} {} {},{} L {},{} L {},{} ' +
'L {},{} A {},{} {} {} {} {},{} L {},{} Z').format(-R-r, h,
-R+r, h, -R+r, 0, R-r, R-r, 0, 0, 1, R-r, 0, R-r, h, R+r, h, R+r, 0,
R+r, R+r, 0, 0, 0, -R-r, 0, -R-r, h)
doc.draw_object('path', {'d':d, 'style':'fill:#ff0000; ' +
'stroke:none;'}, group=g)
d = ('M {},{} L {},{} L {},{} A {},{} {} {} {} {},{} ' +
'L {},{} A {},{} {} {} {} {},{} L {},{} Z').format(-R-r, h,
-R+r, h, -R+r, 0, R-r, R-r, 0, 0, 1, 0, -R+r, 0, -R-r,
R+r, R+r, 0, 0, 0, -R-r, 0, -R-r, h)
doc.draw_object('path', {'d':d, 'style':'fill:#00cc00;stroke:none;'},
group=g)
d = ('M {},{} L {},{} L {},{} L {},{} L {},{} Z').format(-R-r, h,
-R+r, h, -R+r, 0, -R-r, 0, -R-r, h)
doc.draw_object('path', {'d':d, 'style':'fill:url(#grad1);stroke:none;'},
group=g)
d = ('M {},{} L {},{} L {},{} L {},{} L {},{} Z').format(R-r, h,
R+r, h, R+r, 0, R-r, 0, R-r, h)
doc.draw_object('path', {'d':d, 'style':'fill:url(#grad1);stroke:none;'},
group=g)
d = ('M {},{} L {},{} A {},{} {} {} {} {},{} ' +
'L {},{} A {},{} {} {} {} {},{} Z').format(-R-r, 0, -R+r, 0,
R-r, R-r, 0, 0, 1, R-r, 0, R+r, 0, R+r, R+r, 0, 0, 0, -R-r, 0)
doc.draw_object('path', {'d':d, 'style':'fill:url(#grad2);stroke:none;',
'mask':'url(#mask4)'}, group=g)
d = ('M {},{} L {},{} A {},{} {} {} {} {},{} ' +
'L {},{} A {},{} {} {} {} {},{} Z').format(-R-r, 0, -R+r, 0,
R-r, R-r, 0, 0, 1, R-r, 0, R+r, 0, R+r, R+r, 0, 0, 0, -R-r, 0)
doc.draw_object('path', {'d':d, 'style':'fill:url(#grad3);stroke:none;',
'mask':'url(#mask5)'}, group=g)
d = ('M {},{} L {},{} L {},{} A {},{} {} {} {} {},{} L {},{} L {},{} ' +
'L {},{} A {},{} {} {} {} {},{} L {},{} Z').format(-R-r, h,
-R+r, h, -R+r, 0, R-r, R-r, 0, 0, 1, R-r, 0, R-r, h, R+r, h, R+r, 0,
R+r, R+r, 0, 0, 0, -R-r, 0, -R-r, h)
doc.draw_object('path', {'d':d, 'style':'fill:none; ' +
'stroke:#000000; stroke-width:0.04;'}, group=g)
text_N = doc.draw_object('text', {'text-anchor':'middle', 'x':'0', 'y':'0',
'transform':'translate({},{}) scale({},{})'.format(R, h-0.6, 0.04, -0.04),
'style':'fill:#000000; stroke:none; ' +
'font-size:12px; font-family:Bitstream Vera Sans;'}, group=g)
text_N.text = 'N'
text_S = doc.draw_object('text', {'text-anchor':'middle', 'x':'0', 'y':'0',
'transform':'translate({},{}) scale({},{})'.format(-R, h-0.6, 0.04, -0.04),
'style':'fill:#000000; stroke:none; ' +
'font-size:12px; font-family:Bitstream Vera Sans;'}, group=g)
text_S.text = 'S'
doc.write()