summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/metapost/featpost/example/fieldlinesnormapaper.mp
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/metapost/featpost/example/fieldlinesnormapaper.mp')
-rw-r--r--Master/texmf-dist/doc/metapost/featpost/example/fieldlinesnormapaper.mp183
1 files changed, 183 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/metapost/featpost/example/fieldlinesnormapaper.mp b/Master/texmf-dist/doc/metapost/featpost/example/fieldlinesnormapaper.mp
new file mode 100644
index 00000000000..85fab7de40e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/featpost/example/fieldlinesnormapaper.mp
@@ -0,0 +1,183 @@
+% fieldlinesnormapaper.mp
+% L. Nobre G.
+% 2009
+
+input featpost3Dplus2D;
+
+Spread := 25;
+f := (20,0,0);
+
+color posa, posb, perpd;
+numeric limy, limz, bord;
+posa = (0,-3,3); %%%%%%%% allways make Y(posa) < Y(posb) %%%%%%%%%%%
+posb = (0,3,-2); %%%%%%%%%%%% never make Y(posa) = Y(posb) %%%%%%%%%
+perpd = (1,0,0);
+limy = 7;
+limz = 5;
+bord = 2.5;
+
+def vecfunc( expr posit )=
+ begingroup
+ save field;
+ color field, horiz, verti, vech, vecv;
+ numeric modula, modulb, ypos, zpos, hd, hf, vd, vf, zref, yref;
+ modula = conorm( posit-posa );
+ modulb = conorm( posit-posb );
+ field = N( ( posit-posa )/(modula**3)-( posit-posb )/(modulb**3) );
+ ypos = Y( posit );
+ zpos = Z( posit );
+ if Z(posa) <> Z(posb):
+ (ypos,zref) = whatever[(Y(posa),Z(posa)),(Y(posb),Z(posb))];
+ (yref,zpos) = whatever[(Y(posa),Z(posa)),(Y(posb),Z(posb))];
+ if ( abs(zpos) > limz-bord ):
+ hd = abs(zpos)-limz+bord;
+ if ypos < yref:
+ if zpos > 0:
+ vech = -green;
+ else:
+ vech = green;
+ fi;
+ else:
+ if zpos > 0:
+ vech = green;
+ else:
+ vech = -green;
+ fi;
+ fi;
+ else:
+ hd = 0;
+ vech = black;
+ fi;
+ else:
+ zref = Z(posa);
+ vech = green;
+ if ( abs(zpos) > limz-bord ):
+ hd = abs(zpos)-limz+bord;
+ else:
+ hd = 0;
+ fi;
+ fi;
+ if ( abs(ypos) > limy-bord ):
+ vd = abs(ypos)-limy+bord;
+ if zpos > zref:
+ if ypos < 0:
+ vecv = blue;
+ else:
+ vecv = -blue;
+ fi;
+ else:
+ if ypos < 0:
+ vecv = -blue;
+ else:
+ vecv = blue;
+ fi;
+ fi;
+ else:
+ vd = 0;
+ vecv = black;
+ fi;
+ hf = (hd/bord)**2;
+ vf = (vd/bord)**2;
+ ( N(field*(0.975-hf)*(0.975-vf)+hf*vech+vf*vecv) )
+ endgroup
+enddef;
+
+def potfunc( expr posit )=
+ begingroup
+ color field;
+ field = vecfunc( posit );
+ ( ncrossprod( field, perpd ) )
+ endgroup
+enddef;
+
+beginfig(1);
+ numeric i, lena, lenb, numa, numb, sa, sb, diffstep, ray;
+ numeric j, gridstep, fac;
+ color stp, grdp, locv;
+ path oneline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 60;
+ lenb = 40;
+ numa = 15;
+ numb = 30;
+ diffstep = 0.1;
+ ray = 0.5;
+ sa = 40;
+ sb = 5;
+ fac = 0.275;
+ gridstep = 0.3;
+ for i=-limy+0.5*gridstep step gridstep until limy-0.5*gridstep:
+ for j=-limz+0.5*gridstep step gridstep until limz-0.5*gridstep:
+ grdp := (0,i,j);
+ locv := 0.5*fac*vecfunc( grdp );
+ drawarrow rp(grdp-locv)--rp(grdp+locv);
+ endfor;
+ endfor;
+ for i=sa step numa until (360-sa):
+ stp := posa+( 0, ray*cosd(i), ray*sind(i) );
+ oneline := fieldlinepath( lena, stp, diffstep, vecfunc );
+ draw oneline withpen grossa;
+ draw oneline withpen fina withcolor background;
+ endfor;
+ for i=sb step numb until (360-sb):
+ stp := posb+( 0, ray*cosd(i), ray*sind(i) );
+ oneline := fieldlinepath( lenb, stp, -diffstep, vecfunc );
+ draw oneline withpen grossa;
+ draw oneline withpen fina withcolor background;
+ endfor;
+ drawoptions(withpen grossa);
+ draw rp(posa);
+ draw rp(posb);
+ draw rp((0,-limy,-limz))--rp((0, limy,-limz))--
+ rp((0, limy, limz))--rp((0,-limy, limz))--cycle;
+ drawoptions();
+endfig;
+
+beginfig(2);
+ numeric i, lena, numa, diffstep, fac, gridstep, margnum;
+ color stp, grdp, locv;
+ path oneline, twoline, bordeline;
+ pen grossa, fina;
+ grossa = pencircle scaled 3pt;
+ fina = pencircle scaled 2pt;
+ lena = 85;
+ numa = 13;
+ margnum = 2;
+ diffstep = 0.2;
+ fac = 0.275;
+ gridstep = 0.3;
+ for i=-limy+0.5*gridstep step gridstep until limy-0.5*gridstep:
+ for j=-limz+0.5*gridstep step gridstep until limz-0.5*gridstep:
+ grdp := (0,i,j);
+ locv := 0.5*fac*potfunc( grdp );
+ drawarrow rp(grdp-locv)--rp(grdp+locv);
+ endfor;
+ endfor;
+ for i=margnum upto numa-margnum:
+ stp := (i/numa)[posa,posb];
+ oneline := fieldlinepath( lena, stp, diffstep, potfunc );
+ twoline := fieldlinepath( lena, stp, -diffstep, potfunc );
+ draw oneline withpen grossa;
+ draw twoline withpen grossa;
+ endfor;
+ drawoptions(withpen grossa);
+ draw rp(posa);
+ draw rp(posb);
+ bordeline = rp((0,-limy,-limz))--rp((0, limy,-limz))--
+ rp((0, limy, limz))--rp((0,-limy, limz))--cycle;
+ clip currentpicture to bordeline;
+ draw bordeline;
+ drawoptions(withpen fina);
+ numeric side;
+ path aux, electri;
+ side = 10mm;
+ aux = origin--(side,0)--(side,side)--cycle;
+ z0 = 0.667[origin,(side,0.5*side)];
+ electri = aux shifted (-z0) rotated (45+angle(rp(posb)-rp(posa)));
+ fill electri shifted rp(posb);
+ fill electri rotated 180 shifted rp(posa);
+endfig;
+
+end.