diff options
Diffstat (limited to 'Master/texmf-dist/dvips')
-rwxr-xr-x | Master/texmf-dist/dvips/pst-electricfield/pst-electricfield.pro | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/Master/texmf-dist/dvips/pst-electricfield/pst-electricfield.pro b/Master/texmf-dist/dvips/pst-electricfield/pst-electricfield.pro new file mode 100755 index 00000000000..8a73b36e96e --- /dev/null +++ b/Master/texmf-dist/dvips/pst-electricfield/pst-electricfield.pro @@ -0,0 +1,243 @@ +%% $Id: pst-3dplot.pro 236 2009-12-31 08:59:43Z herbert $ +%% +%% This is file `pst-electricfield.pro', +%% +%% IMPORTANT NOTICE: +%% +%% Package `pst-electricfield.tex' +%% Jürgen Gilg +%% Manuel Luque +%% Patrice Megrét +%% Herbert Voss +%% +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN archives +%% in directory macros/latex/base/lppl.txt. +%% +%% DESCRIPTION: +%% `pst-electricfield' is a PSTricks package to draw fields of charges +%% +%% version 0.04 / 2010-06-08 Herbert Voss <hvoss _at_ tug.org> +%% +% +/tx@EFieldDict 60 dict def +tx@EFieldDict begin +% +% helper functions +/getX { xCoor exch get } def +/getY { yCoor exch get } def +/getQ { Qcharges exch get } def +% /getR { Radius exch get } def +% +/setValues { + /xCoor [ + 0 1 NoQ { + /i exch def + /qi QXYN i get def + qi 1 get} for + ] def + /yCoor [ + 0 1 NoQ { + /i exch def + /qi QXYN i get def + qi 2 get} for + ] def +} def +/Radius {xP i getX sub yP i getY sub Pyth} def +% +/fleche { + gsave + x2 y2 moveto + y2 y1 sub x2 x1 sub atan rotate % 1 1 scale + -1 CLW mul 2 CLW mul rlineto + 7 CLW mul -2 CLW mul rlineto + -7 CLW mul -2 CLW mul rlineto + closepath + fill + grestore +} def +% +%% syntaxe : any isbool --> booleen +/isbool { type (booleantype) cvn eq } def +%% syntaxe : any isinteger --> booleen +/isinteger { type (integertype) cvn eq } def +% +/drawChargeCircle { % qi x y r on the stack + 0 360 arc + gsave + 0 ge {1}{0} ifelse setgray fill + grestore + 0 setgray stroke +} def +% +/Electricfield { + % extraction des donnees = qi, xi, yi, Ni, plotCharge + /NoQ QXYN length 1 sub def % nombre de charges -1 + /NL [ % les lignes + 0 1 NoQ { + /i exch def + /qi QXYN i get def + qi length 3 eq + { /nL N def } + { qi 3 get dup isinteger + { /nL ED } + { pop /nL N def } ifelse } ifelse + nL } for + ] def + /plotCharge [ % les lignes + 0 1 NoQ { + /i exch def + /qi QXYN i get def + qi length 3 eq + { /pC true def } + { qi length 4 eq + { qi 3 get dup isbool + { /pC ED } + { pop /pC true def } ifelse } + { qi 4 get /pC ED } ifelse } ifelse + pC } for + ] def + /Qcharges [ % les charges + 0 1 NoQ { + /i exch def + /qi QXYN i get def + qi 0 get} for + ] def + setValues + 0 0 moveto + /Lignes [ % on stroke dans un tableau toutes lignes + 0 1 NoQ { + /iQ ED % on considere chacune des charges + /dAngle 360 NL iQ get 1 sub div def + /pasX iQ getQ 0 ge {Pas} {Pas neg} ifelse def + /xStart iQ getX def + /yStart iQ getY def + [ + 0 dAngle 360 dAngle sub { + /iA ED % on en fait le tour + /xP xStart pasX iA cos mul add def + /yP yStart pasX iA sin mul add def + [ NbrePoints { % nombre de points + 0 0 + 0 1 NoQ { + /i ED + i getQ xP i getX sub mul Radius 3 exp Div add exch + i getQ yP i getY sub mul Radius 3 exp Div add exch + } for + /Ex ED + /Ey ED + /NormeE Ex Ey Pyth def + /dX Ex NormeE div pasX mul def + /dY Ey NormeE div pasX mul def + /xP xP dX add def /yP yP dY add def + [ xP xUnit mul yP yUnit mul ] + } repeat + ] + } for + ] + } for + ] def +% on lit les tableaux et on dessine les lignes + 0 1 Lignes length 1 sub { + /iQ ED % chaque charge + /qi iQ getQ def + /Lignes_Champ Lignes iQ get def + 0 1 Lignes_Champ length 1 sub { + /iLi ED + /Ligne_Champ Lignes_Champ iLi get def % une ligne + Ligne_Champ 0 get aload pop moveto % xP yP + 1 1 Ligne_Champ length 1 sub { + /iCompteur exch def + Ligne_Champ iCompteur get aload pop lineto + } for + stroke + % les fleches + Ligne_Champ dup length 1 sub posArrow mul cvi get aload pop + /y1 ED + /x1 ED + Ligne_Champ dup length 1 sub posArrow mul cvi 1 add get aload pop + /y2 ED + /x2 ED + /X1 x2 def + /X2 x1 def + /Y1 y2 def + /Y2 y1 def + qi 0 le { /x1 X1 def /x2 X2 def /y1 Y1 def /y2 Y2 def} if + fleche + } for + } for + 0 1 NoQ { + /i exch def + Qcharges i get dup /qi ED + xCoor i get xUnit mul + yCoor i get yUnit mul % now on stack: qi x y + plotCharge i get % relative or absolute radii? + { ChargeRadius qi abs mul drawChargeCircle } + { ChargeRadius 0 gt + { ChargeRadius drawChargeCircle } + { pop pop pop } ifelse } ifelse + } for +} def % Electricfield +% +% +/Equipotential { +% extraction des donnees = qi, xi, yi, + /NoQ QXYN length 1 sub def % nombre de charges -1 + /Qcharges [ % les charges + 0 1 NoQ { + /i exch def + /qi QXYN i get def + qi 0 get} for + ] def + setValues + /Func { + 0 + 0 1 NoQ {/i exch def + /qi QXYN i get def + qi 0 get + Radius div add } for + 9 mul % V en volts q en nC + V sub + } def + % code extrait de pst-func + /xPixel xMax xMin sub xUnit mul round cvi def + /yPixel yMax yMin sub yUnit mul round cvi def + /dx xMax xMin sub xPixel div def + /dy yMax yMin sub yPixel div def + /setpixel { + dy div exch + dx div exch + LW 2 div 0 360 arc fill + } bind def +% + Vmin StepV Vmax { + /V ED + /VZ true def % suppose that F(x,y)>=0 + /xP xMin def + /yP yMin def + Func 0.0 lt { /VZ false def } if % first value + xMin dx StepFactor mul xMax { + /xP exch def + yMin dy StepFactor mul yMax { + /yP exch def + Func 0 lt + { VZ { xP yP setpixel /VZ false def} if } + { VZ {}{ xP yP setpixel /VZ true def } ifelse } ifelse + } for + } for +% + /xP xMin def /y yMin def Func 0.0 lt { /VZ false def } if % erster Wert + yMin dy StepFactor mul yMax { + /yP exch def + xMin dx StepFactor mul xMax { + /xP exch def + Func 0 lt + { VZ { xP yP setpixel /VZ false def} if } + { VZ {}{ xP yP setpixel /VZ true def } ifelse } ifelse + } for + } for + } for +} def % Equipotential +% +end % tx@EFieldDict +%
\ No newline at end of file |