From be8718baa5658e074feaefd6af07caef1a501f4a Mon Sep 17 00:00:00 2001 From: Juergen Gilg Date: Fri, 22 Jun 2012 12:08:35 +0200 Subject: [PATCH] =?utf8?q?Ajout=C3=A9=20\datRoot=20dans=20pst-eqdf.tex=20p?= =?utf8?q?our=20usage=20distiller=20et=20mettre=20pstricks-add.tex=20dans?= =?utf8?q?=20le=20repertoire...=20Structuration=20du=20repertoire=20gravit?= =?utf8?q?ation=20...?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- gravitation/LISTE.txt | 5 + gravitation/gravitation_01_distiller.pdf | Bin 0 -> 83436 bytes gravitation/gravitation_01_distiller.tex | 473 +++++ gravitation/pst-eqdf.tex | 10 +- gravitation/pstricks-add.tex | 2411 ++++++++++++++++++++++ 5 files changed, 2897 insertions(+), 2 deletions(-) create mode 100644 gravitation/gravitation_01_distiller.pdf create mode 100644 gravitation/gravitation_01_distiller.tex create mode 100644 gravitation/pstricks-add.tex diff --git a/gravitation/LISTE.txt b/gravitation/LISTE.txt index d6cc6c6..dc03eea 100644 --- a/gravitation/LISTE.txt +++ b/gravitation/LISTE.txt @@ -5,6 +5,11 @@ gravitation_01.tex gravitation_01.pdf gravitation_02.tex gravitation_02.pdf +== Exemples avec Adobe Distiller +gravitation_01_distiller.tex +gravitation_01_distiller.pdf +== Les fichiers du package pst-eqdf.tex pst-eqdf.sty +pstricks-add.tex diff --git a/gravitation/gravitation_01_distiller.pdf b/gravitation/gravitation_01_distiller.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2d06370caaf3b1dca578385eb9b31e7a3f5f29e8 GIT binary patch literal 83436 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�QtTI6QwA9zk6Q8o`v+Rn*6IH@v?h?^0)%S>S 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≈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¥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 v0y)\uput[ur](!v0x v0y){$\overrightarrow{v_0}$}} +\psline[linestyle=dashed](A)(P) +\pscircle*(A){0.05} +\uput[ul](A){$A$} +\uput[dr](P){$P$} +% position du satellite \`{a} un instant quelconque +\pstVerb{/theta_i 170 def + /radius par 1 exc theta_i theta0 sub cos mul add div def + /xS radius theta_i cos mul def + /yS radius theta_i sin mul def + /ux theta_i cos 1 mul def + /uy theta_i sin 1 mul def + /xi xS ux sub def + /yi yS uy sub def + /xi2 xS ux 2 div sub def + /yi2 yS uy 2 div sub def}% +\pnode(!xi2 yi2){Mi2} +\pnode(!xi yi){Mi} +\pnode(!xS yS){S} +\pscircle*(S){0.05} +\psline[linestyle=dotted](S)(0,0) +\psline[style=vecteurA]{->}(S)(Mi) +\uput[l](S){S} +\uput[u](Mi2){$\overrightarrow{F}$} +\psarcn{->}(0,0){0.4}{0}{!theta0} +\uput{0.5}[!theta0 2 div](0,0){$\theta_0$} +\rput(A){\psline[style=vecteurB]{->}(!vAx vAy)} +%\rput(P){\psline[style=vecteurB]{->}(!vPx vPy)} +\psline[arrowinset=0.05,arrowsize=0.1]{<->}(2,0)(0,0)(0,5) +\uput[r](0,4.9){$y$}\uput[u](1.9,0){$x$} +\psdot(O)\uput[r](O){$\Omega$} +\rput{!90 theta0 add}(O){\psline[linestyle=dashed](!b_2 neg 0)(!b_2 0)} +\end{pspicture} +\caption{Mouvement d'un satellite} + \end{center} +\end{figure} +Soit (M) la masse de l'astre et (m) celle du satellite avec $m\ll M$. Le centre de masse du syst\`{e}me \{M,m\} est confondu avec le centre de l'astre attracteur. La mise en orbite s'effectue \`{a} partir du point $M_0(x_0,y_0)$ avec une vitesse $\overrightarrow{v_0}(v_{0_x},v_{0_x})$. $\theta_0$ est l'angle que fait $\overrightarrow{Ox}$ avec $\overrightarrow{OM_0}$. Le satellite (S), suppos\'{e} ponctuel, subit de la part de l'astre une force d'attraction gravitationnelle : +\[ +\overrightarrow{F}=-\mathcal{G}\frac{Mm}{r^2}\overrightarrow{u}\qquad \text{avec}\quad \overrightarrow{u}=\frac{\overrightarrow{r}}{r}\quad \text{et}\quad \overrightarrow{r}=\overrightarrow{OS} +\] +Tous les \textit{bons} livres de m\'{e}canique\footnote{Comme celui, par exemple, de Jos\'{e}-Philippe P\'{e}rez, aux \'{e}ditions Masson.} \'{e}tablissent les relations suivantes : +\[ +r=\frac{p}{1+\mathrm{e}\cos(\theta-\theta_0)} +\] +Param\`{e}tres et excentricit\'{e} ont pour expressions respectives, avec les notations suivantes : $K=\mathcal{G}Mm$, $\mathcal{E}$ l'\'{e}nergie du syst\`{e}me et $L$ le moment cin\'{e}tique. +\[ +\mathrm{e}=\sqrt{1+\frac{2\mathcal{E}L^2}{mK^2}}\qquad p=\frac{L^2}{mK} +\] +On choisit une vitesse initiale $\overrightarrow{v_0}$ perpendiculaire \`{a} $\overrightarrow{OM_0}$, dans ces conditions le moment cin\'{e}tique et l'\'{e}nergie, qui restent constants, valent : +\[ +L=mr_0v_0\qquad \mathcal{E}=-\frac{K}{r_0}+\frac{1}{2}mv_0^2 +\] +En rempla\c{c}ant $L$ et $\mathcal{E}$, on obtient pour l'excentricit\'{e} et le param\`{e}tre les expressions suivantes : +\[ +\mathrm{e}=\sqrt{1+\frac{1}{\mathcal{G}^2M^2}\Big(\frac{1}{2}v_0^4r_0^2-\mathcal{G}Mr_0v_0^2\Big)} +\] +\[ +p=\frac{v_0^2r_0^2}{\mathcal{G}M} +\] +On se limite au cas du mouvement elliptique, avec, en cons\'{e}quence, la condition : +\[ +\mathcal{E}=-\frac{K}{r_0}+\frac{1}{2}mv_0^2 < 0 +\] +Le demi-grand axe $a$, le demi-petit axe $b$ sont : +\[ +a=\frac{p}{1-\mathrm{e}^2}\qquad b=\frac{p}{\sqrt{1-\mathrm{e}^2}} +\] +La p\'{e}riode $T$ qui ob\'{e}it \`{a} la troisi\`{e}me loi de K\'{e}pler : +\[ +T^2=\frac{4\pi^2a^3}{\mathcal{G}M} +\] +La vitesse, en un point de l'ellipse, se calcule par : +\[ +v^2=\mathcal{G}M\Big( \frac{2}{r}-\frac{1}{a}\Big) +\] +Sachant que $r_p=\dfrac{p}{1+\mathrm{e}}$ et $r_A=\dfrac{p}{1-\mathrm{e}}$, on en d\'{e}duit les vitesses au p\'{e}rig\'{e}e et \`{a} l'apog\'{e}e : +\[ +v_P=\sqrt{\frac{\mathcal{G}M}{p}}(1+\mathrm{e})\qquad v_A=\sqrt{\frac{\mathcal{G}M}{p}}(1-\mathrm{e}) +\] + +\section{L'\'{e}tude avec PSTricks} +\subsection{La trajectoire} +\def\parametres{ + /GM 1 def % 4e14 def % GxM + /x0 6.5e6 def % position initiale + /y0 0 def + /vx0 0 def % vitesse initiale + /vy0 1e4 def +} +% x0 y0 x'0 y'0 +% y[0] y[1] y[2] y[3] +\[ +\left\{ +\begin{array}{rcl} +\ddot{x}&=&-\dfrac{GM}{r^3}x\\[1em] +\ddot{y}&=&-\dfrac{GM}{r^3}y\\ +\end{array} +\right. +\label{eq1} +\qquad r=\sqrt{x^2+y^2} +\] + +On peut dessiner la trajectoire du satellite et de ses caract\'{e}ristiques de deux fa\c{c}ons : +\begin{itemize} + \item par l'utilisation de \verb+\parametricplot+ ; + \item ou celle de \verb+\psplotDiffEqn+. +\end{itemize} +\verb+\parametricplot+ utilise l'expression exacte de l'\'{e}quation de la trajectoire en coordonn\'{e}es polaires : +\begin{verbatim} + \parametricplot[linecolor=red,unit=2,plotpoints=360]{0}{360}{% + /radius par 1 exc t theta0 sub cos mul add div def + radius t cos mul + radius t sin mul} +\end{verbatim} +L'excentricit\'{e}, la p\'{e}riode, demi-grand axe et demi-petit axe sont calcul\'{e}s par quelques lignes de code \textsf{postscript}. Il faut s'assurer que les conditions initiales choisies v\'{e}rifient bien la condition d'une trajectoire elliptique, pour cela il faut que l'\'{e}nergie initiale $\mathcal{E}_0<0$, sinon cela entra\^{\i}nera une erreur lors du passage \`{a} l'interpr\'{e}teur \textsf{postscript}. +\begin{verbatim} +\pstVerb{ + /GM 1 def + /theta0 -45 def + /r0 0.5 def + /x0 r0 theta0 cos mul def + /y0 r0 theta0 sin mul def + /v0 1.92 def + /v0x v0 theta0 sin mul neg def + /v0y v0 theta0 cos mul def + /Lc r0 v0 mul def % moment cinetique + /par Lc dup mul GM div def % param\`{e}tre de l'ellipse +% excentricit\'{e} + /exc 1 0.5 v0 4 exp mul r0 dup mul mul GM r0 mul + v0 dup mul mul sub GM dup mul div 2 mul add sqrt def +%demi-grand axe + /a_2 par 1 exc dup mul sub div def % demi-grand axe +%demi-petit axe + /b_2 par 1 exc dup mul sub sqrt div def % demi-petit axe +% p\'{e}riode + /periode 2 3.1416 dup mul a_2 3 exp mul GM div sqrt mul def +}% +\end{verbatim} +\verb+\psplotDiffEqn+ utilise les \'{e}quations diff\'{e}rentielles du mouvement, en notation alg\'{e}brique : +\begin{verbatim} +% x0 y0 x'0 y'0 +% y[0] y[1] y[2] y[3] +\def\eqsatellite{% +y[2]|y[3]|-GM*y[0]/((sqrt(y[0]^2+y[1]^2))^3)|-GM*y[1]/((sqrt(y[0]^2+y[1]^2))^3)} + \psplotDiffEqn[unit=2,whichabs=0,whichord=1,% + linecolor=blue,linewidth=0.1,% + method=rk4,plotpoints=1000,% + algebraic]{0}{37.8}{x0 y0 v0x v0y}{\eqsatellite}% +\end{verbatim} +Ce qui permet, par ailleurs de v\'{e}rifier la qualit\'{e} du trac\'{e} par la m\'{e}thode num\'{e}rique, en bleu, tandis que le trac\'{e} \`{a} partir de l'expression exacte est en trait fin en rouge. +% +\begin{center} +\begin{pspicture}(-12,-2)(4,10) +\pstVerb{ + /GM 1 def + /theta0 -45 def + /r0 0.5 def + /x0 r0 theta0 cos mul def + /y0 r0 theta0 sin mul def + /v0 1.92 def + /v0x v0 theta0 sin mul neg def + /v0y v0 theta0 cos mul def + /Lc r0 v0 mul def % moment cinetique + /par Lc dup mul GM div def % param\`{e}tre de l'ellipse +% excentricit\'{e} + /exc 1 0.5 v0 4 exp mul r0 dup mul mul GM r0 mul v0 dup mul mul sub GM dup mul div 2 mul add sqrt def +%%%%%%%%%%%%%% + /a_2 par 1 exc dup mul sub div def % demi-grand axe + /b_2 par 1 exc dup mul sub sqrt div def % demi-petit axe + /periode 2 3.1416 dup mul a_2 3 exp mul GM div sqrt mul def +}% +\psframe*[linecolor=white](-3,-0.2)(0,0.2) +\pscircle[fillcolor=blue!50,fillstyle=solid](0,0){0.5} +\psgrid[unit=2,subgriddiv=2,gridcolor=lightgray,gridlabels=8pt](-6,-1)(2,5) +\rput(-2,0){T=\psPrintValue[decimals=2]{periode}\hphantom{00000}s} + \psplotDiffEqn[unit=2,whichabs=0,whichord=1,linecolor=blue,linewidth=0.1,method=rk4,plotpoints=1000,algebraic]{0}{37.8}{x0 y0 v0x v0y}{\eqsatellite}% +\parametricplot[linecolor=red,unit=2,plotpoints=360]{0}{360}{/radius par 1 exc t theta0 sub cos mul add div def + radius t cos mul + radius t sin mul} +\psdot[unit=2,dotsize=0.12](!x0 y0) +\rput(!x0 2 mul y0 2 mul){\psline[style=vecteurC]{->}(!v0x v0y)} +\end{pspicture} +\end{center} +\subsection{La vitesse} +\verb+\psplotDiffEqn+ permet de voir comment varie la vitesse sur l'ellipse : +\begin{verbatim} +% x0 y0 x'0 y'0 +% y[0] y[1] y[2] y[3] + \psplotDiffEqn[xunit=0.2,yunit=5,% + plotfuncy=dup 2 get dup mul exch 3 get dup mul add sqrt, + linecolor=red,method=rk4,plotpoints=1000, + algebraic]{0}{50}{x0 y0 v0x v0y}{\eqsatellite}% +\end{verbatim} +\begin{center} +\begin{pspicture}(0,-1)(10,7) +\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt] +\pstVerb{/GM 1 def + /theta0 -35 def + /r0 1 def + /x0 r0 theta0 cos mul def + /y0 r0 theta0 sin mul def + /v0 1.3 def + /v0x v0 theta0 sin mul neg def + /v0y v0 theta0 cos mul def}% +\psplotDiffEqn[xunit=0.2,yunit=5, + plotfuncy=dup 2 get dup mul exch 3 get dup mul add sqrt, + ,linecolor=red,method=rk4,plotpoints=1000,algebraic]{0}{50}{x0 y0 v0x v0y}{\eqsatellite}% + \multido{\i=1+1,\I=5+5}{9}{\uput[u](\i,0){\I}} +\pnode(! 36.4 5 div 0){P} +\psdot(P)\uput[d](P){P\'{e}rig\'{e}e} +\psline[linestyle=dashed](P)(! 36.4 5 div 7) +\pnode(! 36.4 10 div 0){A} +\psdot(A)\uput[d](A){Apog\'{e}e} +\psline[linestyle=dashed](A)(! 36.4 10 div 7) +\uput[l](0,6.5){$v$} +\psline[arrowinset=0.1,arrowsize=0.2]{<->}(10,0)(0,0)(0,7) +\uput[u](10,0){$t$(s)} +\uput[ul](0,0){0} +\end{pspicture} +\end{center} +On peut obtenir les caract\'{e}ristiques de la vitesse en un point quelconque, car le moment cin\'{e}tique $L=mr\dot{\theta}$ \'{e}tant constant, pour chaque valeur de $\theta$, on en d\'{e}duit $r$ puis $\dot{\theta}$. En coordonn\'{e}es polaires, la vitesse s'exprime par : +\[ +\overrightarrow{v}=\dot{r}\overrightarrow{u_r}+r\dot{\theta}\overrightarrow{u_{\theta}} +\] +$\dot{\theta}$ et $\dot{r}$ s'obtiennent par les relations suivantes : +\[ +\dot{\theta}=\frac{r_0v_0}{r^2} +\] +\[ +\dot{r}=-\frac{p(-\dot{\theta}\sin(\theta-\theta_0)}{(1+\mathrm{e}\cos(\theta-\theta_0))^2}=\frac{r_0v_0}{p}\sin(\theta-\theta_0) +\] +La cha\^{\i}ne de calculs est la suivante : $\theta\Longrightarrow r\Longrightarrow \dot{\theta}\Longrightarrow \dot{r}\Longrightarrow \overrightarrow{v}$. + +Le package `\textsf{pst-eqdf}' comprend la commande \verb+\psequadiff+ qui est une version simplifi\'{e}e de \verb+\psplotDiffEqn+, dont elle ne reprend que la m\'{e}thode Runge-Kutta~4. Elle permet de sauvegarder sous forme de tableaux et/ou de fichiers toutes les variables et les d\'{e}riv\'{e}es de la fonction \'{e}tudi\'{e}e, cette possibilit\'{e} est int\'{e}ressante pour d\'{e}terminer les caract\'{e}ristiques de la vitesse au cours du temps et elle est particuli\`{e}rement utile pour cr\'{e}er une animation. Nous allons l'utiliser pour dessiner le vecteur-vitesse \`{a} quelques instants. + +On sauve successivement le tableau des positions et celui des vitesses. +\begin{verbatim} +\psequadiff[method=rk4,plotpoints=1000, + algebraic, + whichabs=0,whichord=1, + tabname=XiYi]{0}{43}{x0 y0 v0x v0y}{\eqsatellite}% +\end{verbatim} +\begin{verbatim} +\psequadiff[method=rk4,plotpoints=1000, + algebraic, + whichabs=2,whichord=3, + tabname=vxvy]{0}{43}{x0 y0 v0x v0y}{\eqsatellite}% +\end{verbatim} + +Pour ensuite dessiner la trajectoire et les vecteurs-vitesse. +\begin{verbatim} +%\listplot[unit=1]{vxvy aload pop} +% on dessine la vitesse un point sur 100 +\pscircle[fillcolor=gray!70,fillstyle=solid](0,0){0.3} +\multido{\i=0+100}{20}{% +\pstVerb{/vX vxvy \i\space get def + /vY vxvy \i\space 1 add get def + /xi XiYi \i\space get def + /yi XiYi \i\space 1 add get def}% +\rput(!xi yi){\psline[style=vecteurA]{->}(! vX 2 mul vY 2 mul)}} +\end{verbatim} +\begin{center} +\begin{pspicture}(-10,-10)(6,7) +\psset{unit=2}% +\pstVerb{/GM 1 def + /theta0 30 def + /r0 2 def + /x0 r0 theta0 cos mul def + /y0 r0 theta0 sin mul def + /v0 0.85 def + /v0x v0 theta0 sin mul neg def + /v0y v0 theta0 cos mul def + /Lc r0 v0 mul def % moment cinetique + /par Lc dup mul GM div def % param\`{e}tre de l'ellipse +% excentricit\'{e} + /exc 1 0.5 v0 4 exp mul r0 dup mul mul GM r0 mul v0 dup mul mul sub GM dup mul div 2 mul add sqrt def +%%%%%%%%%%%%%% + /a_2 par 1 exc dup mul sub div def % demi-grand axe + /b_2 par 1 exc dup mul sub sqrt div def % demi-petit axe + /periode 2 3.1416 dup mul a_2 3 exp mul GM div sqrt mul def}% +\rput(-2,0){T=\psPrintValue[decimals=2]{periode}\hphantom{00000}s} +\psequadiff[method=rk4, + plotpoints=1000, + algebraic, + whichabs=0, + whichord=1, + tabname=XiYi +% ,saveData,filename=XiYi.dat +]{0}{43}{x0 y0 v0x v0y}{\eqsatellite}% +\listplot{XiYi aload pop} +\psequadiff[method=rk4, + plotpoints=1000, + algebraic, + whichabs=2, + whichord=3, + tabname=vxvy +% ,saveData,filename=vxvy.dat +]{0}{43}{x0 y0 v0x v0y}{\eqsatellite}% +%\listplot[unit=1]{vxvy aload pop} +% on dessine la vitesse un point sur 100 +\pscircle[fillcolor=gray!70,fillstyle=solid](0,0){0.3} +\multido{\i=0+100}{20}{% +\pstVerb{/vX vxvy \i\space get def + /vY vxvy \i\space 1 add get def + /xi XiYi \i\space get def + /yi XiYi \i\space 1 add get def}% +\rput(!xi yi){\psline[style=vecteurA]{->}(! vX 2 mul vY 2 mul)}} +\psgrid[subgriddiv=2,gridcolor=lightgray,gridlabels=8pt](-5,-5)(3,3) +\end{pspicture} +\end{center} + + + +\section{Mouvement circulaire} + \begin{center} +\psset{unit=1} +\begin{pspicture}(-5,-5.5)(5,5.5) +\pstVerb{ + /GM 1 def + /theta0 60 def + /r0 5 def + /x0 r0 theta0 cos mul def + /y0 r0 theta0 sin mul def + /v0 GM r0 div sqrt def + /v0x v0 theta0 sin mul neg def + /v0y v0 theta0 cos mul def + /Lc r0 v0 mul def % moment cinetique + /par Lc dup mul GM div def % param\`{e}tre de l'ellipse +% excentricit\'{e} + /exc 1 0.5 v0 4 exp mul r0 dup mul mul GM r0 mul v0 dup mul mul sub GM dup mul div 2 mul add sqrt def +%%%%%%%%%%%%%% + /a_2 par 1 exc dup mul sub div def % demi-grand axe + /b_2 par 1 exc dup mul sub sqrt div def % demi-petit axe + /periode 2 3.1416 mul a_2 3 exp GM div sqrt mul def +% vitesse \`{a} l'apog\'{e}e + /vA GM par div sqrt 1 exc sub mul def +% vitesse au p\'{e}rig\'{e}e + /vP GM par div sqrt 1 exc add mul def +% coordonn\'{e}es de vA + /vAx vA theta0 90 add cos mul neg def + /vAy vA theta0 90 add sin mul neg def +% coordonn\'{e}es de vP + /vPx vP theta0 90 add cos mul def + /vPy vP theta0 90 add sin mul def +}% +\pscircle[fillcolor=gray!70,fillstyle=solid](0,0){0.75} +\psdot[dotstyle=+](0,0) +\uput[d](0,0){O} +\psgrid[subgriddiv=2,gridcolor=lightgray,gridlabels=8pt](-5,-5)(5,5) +\rput(0,-2){\psframebox[linestyle=none,fillstyle=solid,fillcolor=white]{T=\psPrintValue[decimals=2]{periode}\hphantom{000000}s}} +\parametricplot[linecolor=red,plotpoints=360]{0}{360}{/radius par 1 exc t theta0 sub cos mul add div def + radius t cos mul + radius t sin mul} +\pscircle*(!x0 y0){0.1} +%\pnode(!par 1 exc add div theta0 cos mul par 1 exc add div theta0 sin mul){P} % p\'{e}rig\'{e}e +%\pnode(!par 1 exc sub div theta0 cos mul neg par 1 exc sub div theta0 sin mul neg){A} % Apog\'{e}e +\rput(!x0 y0){\psline[arrowinset=0.1,arrowsize=0.2,linecolor={[rgb]{0 0.5 1}},unit=4]{->}(!v0x v0y)\uput[ur](!v0x 2 mul v0y 2 mul){$\overrightarrow{v_0}$}} +\uput[ur](!x0 y0){$M_0$} +\psline[linestyle=dashed](0,0)(!x0 y0) +% position du satellite \`{a} un instant quelconque +\pstVerb{/theta_i 170 def + /radius par 1 exc theta_i theta0 sub cos mul add div def + /xS radius theta_i cos mul def + /yS radius theta_i sin mul def + /ux theta_i cos 1 mul def + /uy theta_i sin 1 mul def + /xi xS ux sub def + /yi yS uy sub def + /xi2 xS ux 2 div sub def + /yi2 yS uy 2 div sub def}% +\pnode(!xi2 yi2){Mi2} +\pnode(!xi yi){Mi} +\pnode(!xS yS){S} +\pscircle*(S){0.1} +\psline[linestyle=dotted](S)(0,0) +\psline[style=vecteurC]{->}(S)(Mi) +\uput[l](S){S} +\uput[u](Mi2){$\overrightarrow{F}$} +\psarc{->}(0,0){1}{0}{!theta0} +\uput{1.1}[!theta0 2 div](0,0){$\theta_0$} +\psline[arrowinset=0.1,arrowsize=0.2]{<->}(5,0)(0,0)(0,5) +\psline[arrowinset=0.05,arrowsize=0.1]{<->}(5,0)(0,0)(0,5) +\uput[u](0,5){$y$}\uput[r](5,0){$x$} +\end{pspicture} + \end{center} +Il s'obtient tr\`{e}s facilement \`{a} partir de l'\'{e}tude pr\'{e}c\'{e}dente si on sait que dans ce cas : +\[ +v_0=\sqrt{\frac{\mathcal{G}M}{r_0}} +\] +\begin{verbatim} +\pstVerb{ + /GM 1 def + /theta0 60 def + /r0 5 def + /x0 r0 theta0 cos mul def + /y0 r0 theta0 sin mul def + /v0 GM r0 div sqrt def + /v0x v0 theta0 sin mul neg def + /v0y v0 theta0 cos mul def }% +\end{verbatim} + +\end{document} diff --git a/gravitation/pst-eqdf.tex b/gravitation/pst-eqdf.tex index b4dd3cf..0585839 100644 --- a/gravitation/pst-eqdf.tex +++ b/gravitation/pst-eqdf.tex @@ -28,6 +28,12 @@ \catcode`\@=11\relax % Definition of the parameters % ---------------------------- +% Added by JG, 2012 06 20 +\def\datRoot{} +% Definition of a "Root" within the hard drive for Distiller users +% Note: The root must be set with "slashes" not "backslashes" like +% \def\datRoot{C:/Users/Desktop/datfolder/} +% By default the \datRoot is left empty (for non-Distiller usage) \pst@addfams{pst-eqd} \define@key[psset]{pst-eqd}{method}{\edef\psk@method{#1}}% \define@key[psset]{pst-eqd}{whichabs}{\edef\psk@whichabs{#1}}% @@ -35,7 +41,7 @@ \define@key[psset]{pst-eqd}{plotfuncx}{\edef\psk@plotfuncx{#1}}% \define@key[psset]{pst-eqd}{plotfuncy}{\edef\psk@plotfuncy{#1}}% \define@key[psset]{pst-eqd}{tabname}{\edef\psk@tabname{#1}}% -\define@key[psset]{pst-eqd}{filename}{\edef\psk@filename{#1}}% +\define@key[psset]{pst-eqd}{filename}{\edef\psk@filename{\datRoot #1}}% \newif\ifPst@buildvector% \define@key[psset]{pst-eqd}{buildvector}[true]{\@nameuse{Pst@buildvector#1}}% \newif\ifPst@saveData% @@ -50,7 +56,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% #1-#2 x range %% #3 initial value of y (which is a vector) -%% #4 value of the dérivative (y and t can be used) +%% #4 value of the d\'{e}rivative (y and t can be used) \def\psequadiff{\def\pst@par{}\pst@object{psequadiff}} \def\psequadiff@i#1#2#3#4{% \pst@killglue diff --git a/gravitation/pstricks-add.tex b/gravitation/pstricks-add.tex new file mode 100644 index 0000000..e26a324 --- /dev/null +++ b/gravitation/pstricks-add.tex @@ -0,0 +1,2411 @@ +%% $Id: pstricks-add.tex 692 2012-06-04 06:47:40Z herbert $ +%% +%% +%% This is file `pstricks-add.tex', +%% +%% IMPORTANT NOTICE: +%% +%% Package `pstricks-add.tex' +%% +%% Dominique Rodriguez +%% Herbert Voss +%% Michael Sharpe +%% +%% 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: +%% `pstricks-add' is a PSTricks package for additionals to the standard +%% pstricks package +%% +\csname PSTricksAddLoaded\endcsname +\let\PSTricksAddLoaded\endinput +% +% Requires some packages +\ifx\PSTricksLoaded\endinput\else \input pstricks \fi +\ifx\PSTplotLoaded\endinput\else \input pst-plot \fi +\ifx\PSTnodesLoaded\endinput\else \input pst-node \fi +\ifx\PSTthreeDLoaded\endinput\else\input pst-3d \fi +\ifx\MultidoLoaded\endinput\else \input multido \fi +\ifx\PSTXKeyLoaded\endinput\else \input pst-xkey \fi +\ifx\PSTmathLoaded\endinput\else \input pst-math \fi +% +\def\fileversion{3.58} +\def\filedate{2012/06/04} +\message{`pstricks-add' v\fileversion, \filedate\space (dr,hv)} +% +\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax +\SpecialCoor +\pst@addfams{pstricks-add} +% +%% prologue for postcript +\pstheader{pstricks-add.pro}% +% +\def\psGetSlope(#1,#2)(#3,#4)#5{% 4 values without a dimen! #5 is a macro + \pst@dimm=#1pt% + \advance\pst@dimm by -#3pt% + \pst@dimn=#2pt% + \advance\pst@dimn by -#4pt + \pst@divide{\pst@dimn}{\pst@dimm}#5} +% +\def\psGetDistance(#1,#2)(#3,#4)#5{% 4 values without a dimen! #5 is a macro + \pst@dimm=#1pt% + \advance\pst@dimm by -#3pt% + \pst@dimn=#2pt% + \advance\pst@dimn by -#4pt + \pst@pyth\pst@dimm\pst@dimn\pst@dimo + \edef#5{\strip@pt\pst@dimo} +}% +%--------------------------------------- small stuff ------------------------------- +\define@boolkey[psset]{pstricks-add}[Pst@]{CMYK}[true]{} +\psset[pstricks-add]{CMYK=true} +% +\def\defineTColor{\@ifnextchar[{\defineTColor@i}{\defineTColor@i[]}} +\def\defineTColor@i[#1]#2#3{% "semi transparency colors" + \def\pst@tempA{#1}% + \newpsstyle{#2}{% + fillstyle=vlines,hatchwidth=0.1\pslinewidth, + hatchsep=1\pslinewidth,hatchcolor=#3}% + \ifx\pst@tempA\@empty\else\psset{#1}\fi% +} +\defineTColor{TRed}{red} +\defineTColor{TGreen}{green} +\defineTColor{TBlue}{blue} +% +\def\rmultiput{\pst@object{rmultiput}} +\def\rmultiput@i#1{% + \pst@killglue% + \begingroup% + \use@par% + \@ifnextchar({\rmultiput@ii{#1}}{\rmultiput@ii{#1}(\z@,\z@)}} +\def\rmultiput@ii#1(#2){% + \if@star\rput*(#2){#1}\else\rput(#2){#1}\fi + \@ifnextchar({\rmultiput@ii{#1}}{\endgroup}} + +% #1: (x,y) #2: rotAngle #3: object +\def\psrotate{\pst@object{psrotate}} +\def\psrotate@i(#1)#2{% + \pst@killglue + \begingroup% + \use@par\pst@makebox{\psrotate@ii(#1){#2}}} +\def\psrotate@ii(#1)#2{% + \pst@getcoor{#1}\pst@tempA% + \pst@getangle{#2}\pst@tempB% + \leavevmode% + \pst@Verb{% + { \pst@tempA /yRot ED /xRot ED + \pst@tempB dup cos /cosA ED sin /sinA ED + /ax cosA def + /by sinA def + /cx sinA neg def + /dy cosA def + /ex xRot cosA mul neg xRot add yRot sinA mul add def + /fy xRot sinA mul neg yRot add yRot cosA mul sub def + [ax by cx dy ex fy] concat } \tx@TMChange }% + \box\pst@hbox% + \pst@Verb{ \tx@TMRestore }\endgroup} +% +% [#1]: obtargs; (#2,#3): center; {#4}: factor; {#5}: object +\def\psHomothetie{\def\pst@par{}\pst@object{psHomothetie}} +\def\psHomothetie@i(#1)#2{% + \begin@SpecialObj% + \pst@getcoor{#1}\pst@tempA% converts the coordinates without a unit into pt + \pst@makebox{\psHomothetie@ii{#2}}}% put the contents into a box +\def\psHomothetie@ii#1{% + \pst@Verb{% + { \pst@tempA /yH ED /xH ED + [#1 0 0 #1 #1 xH mul neg xH add #1 yH mul neg yH add] concat } + \tx@TMChange }% + \box\pst@hbox% + \pst@Verb{ \tx@TMRestore }% + \end@SpecialObj} +% +\define@key[psset]{pstricks-add}{intSeparator}{\def\psk@intSeparator{#1}} +\psset{intSeparator={,}} +% +\def\psFormatInt{\def\pst@par{}\pst@object{psFormatInt}} +\def\psFormatInt@i#1{{% + \pst@killglue + \use@par + \count1=#1\count2=\count1 + \ifnum\count1=0 0\else + \ifnum\count1>999999 + \count3=\count1 + \divide\count3 by 1000000 + \the\count3\psk@intSeparator\relax + \multiply\count3 by 1000000 + \advance\count1 by -\count3 % modulo 1000000 + \fi% + \ifnum\count2>999 + \count3=\count1 + \divide\count3 by 1000 + \ifnum\count2>99999 + \ifnum\count3<100 0\fi + \ifnum\count3<10 0\fi + \fi% + \the\count3\psk@intSeparator\relax + \multiply\count3 by 1000 + \advance\count1 by -\count3 %modulo 1000 + \fi% + \ifnum\count2>999 + \ifnum\count1<100 0\fi + \ifnum\count1<10 0\fi + \fi% + \the\count1 + \fi% +}\ignorespaces} +% +\define@key[psset]{pstricks-add}{braceWidth}{\pst@getlength{#1}\psk@braceWidth} +\define@key[psset]{pstricks-add}{bracePos}{\pst@checknum{#1}\psk@bracePos} +\define@key[psset]{pstricks-add}{braceWidthInner}{\pst@getlength{#1}\psk@braceWidthInner} +\define@key[psset]{pstricks-add}{braceWidthOuter}{\pst@getlength{#1}\psk@braceWidthOuter} +% +\def\psbrace{\def\pst@par{}\pst@object{psbrace}} +\def\psbrace@i(#1)(#2)#3{% + \addbefore@par{ref=lb,linewidth=0.01pt,fillstyle=solid,fillcolor=black}% default setting + \begin@SpecialObj + \if@star\def\pst@tempC{true }\else\def\pst@tempC{false }\fi + \ifx\psk@rot\empty\def\psk@@rot{0}\else\let\psk@@rot\psk@rot\fi + \def\psk@rot{Alpha \psk@@rot\space add 90 sub}% + \pst@getcoor{#1}\pst@tempA + \pst@getcoor{#2}\pst@tempB + \rput(! + /ifStar \pst@tempC def + /radius1 \psk@braceWidthOuter def + /radius2 \psk@braceWidthInner def + /Alpha \pst@tempA \pst@tempB 3 -1 roll sub 3 1 roll exch sub atan def + gsave STV CP T /ps@rot \psk@rot\space def grestore + /Length \pst@tempA \pst@tempB Pyth2 def + /Left { Length \psk@bracePos\space mul } bind def + /Right { Length Left sub } bind def + /Width \psk@braceWidth def + /pop4 { pop pop pop pop } def + gsave + [ Alpha cos Alpha sin Alpha sin neg Alpha cos \pst@tempA ] concat + 0 0 moveto + 0 radius2 neg radius2 radius2 neg radius2 arcto pop4 + Left radius2 sub radius1 sub 0 rlineto + Left radius2 neg Left radius2 radius1 add neg radius1 arcto pop4 + currentpoint /y@Label ED /x@Label ED + Left radius2 neg Left radius1 add radius2 neg radius1 arcto pop4 + Right radius2 sub radius1 sub 0 rlineto + Length radius2 neg Length 0 radius2 arcto pop4 +% 0 Width neg rlineto + Length radius2 Width add neg Length radius2 sub radius2 Width add neg radius2 arcto pop4 + Right radius2 sub radius1 sub neg 0 rlineto + Left radius1 add Width radius1 add radius2 add neg radius1 90 180 arc + Left radius1 sub Width radius1 add radius2 add neg radius1 0 90 arc + Left radius2 sub radius1 sub neg 0 rlineto + radius2 Width neg radius2 270 180 arcn + 0 0 lineto + \ifx\psk@fillstyle\relax\else + gsave + ifStar { \pst@usecolor\pslinecolor }{ \pst@usecolor\psfillcolor } ifelse + fill + grestore + \fi + \pst@number\pslinewidth setlinewidth \pst@usecolor\pslinecolor stroke + 0 0 moveto + grestore +% now calculate the label pos + /Dh radius1 radius2 add Width add def + \pst@tempA \pst@tempB 3 -1 roll sub 3 1 roll exch sub % dy dx + \psk@bracePos\space mul exch \psk@bracePos\space mul % d'x d'y + \pst@tempA 3 -1 roll add Dh Alpha cos mul sub % d'x x yA + \psk@nodesepB sub % use minus sign to shidt right + 3 1 roll add Dh Alpha sin mul add \psk@nodesepA add + exch \tx@UserCoor ){#3} + \end@SpecialObj} +% +\newdimen\psparallelogramsep +\define@key[psset]{pstricks-add}{parallelogramsep}[3mm]{\pssetlength\psparallelogramsep{#1}} +\psset[pstricks-add]{parallelogramsep=3mm} +% +\def\psparallelogrambox{\pst@object{psparallelogrambox}} +\def\psparallelogrambox@i{\pst@makebox\psparallelogrambox@ii} +\def\psparallelogrambox@ii{% + \begingroup + \pst@useboxpar + \pst@dima=\pslinewidth + \advance\pst@dima by \psframesep + \pst@dimc=\wd\pst@hbox\advance\pst@dimc by \pst@dima + \pst@dimb=\dp\pst@hbox\advance\pst@dimb by \pst@dima + \pst@dimd=\ht\pst@hbox\advance\pst@dimd by \pst@dima +% Dirk Osburg modification begin - Jul. 16, 2011 + \divide\psparallelogramsep by 2 + \advance\pst@dima by \psparallelogramsep + \advance\pst@dimc by \psparallelogramsep +% Dirk Osburg modification end + \setbox\pst@hbox=\hbox{% + \ifpsboxsep\kern\pst@dima\fi + \begin@ClosedObj + \addto@pscode{% + \psk@cornersize + \pst@number\pst@dima neg % left + \pst@number\pst@dimb neg % lower + \pst@number\pst@dimc % right + \pst@number\pst@dimd % upper + .5 +% D.G. modification begin - Nov. 28, 2001 +%\tx@Frame}% + \pst@number\psparallelogramsep + \tx@Parallelogram}% +% D.G. modification end + + \def\pst@linetype{2}% + \showpointsfalse + \end@ClosedObj + \box\pst@hbox + \ifpsboxsep\kern\pst@dima\fi% + }% + \ifpsboxsep\dp\pst@hbox=\pst@dimb\ht\pst@hbox=\pst@dimd\fi + \leavevmode\box\pst@hbox + \endgroup% +} + +% From the Frame and Rect PostScript macros +\pst@def{Parallelogram}<{% + /ParallelogramA { +% Dirk Osburg modification begin - Jul. 16, 2011 +%%%% old stuff: %%% +%x1 pgs sub y1 moveto +%x1 y2 lineto +%x2 pgs add y2 lineto +%x2 y1 lineto +%x1 pgs sub y1 lineto +%%%% replaced by: %%% + x1 pgs sub y1 moveto + x1 pgs add y2 lineto + x2 pgs add y2 lineto + x2 pgs sub y1 lineto + x1 pgs sub y1 lineto +% Dirk Osburg modification end + closepath} def +% +/pgs ED +CLW mul +/a ED +3 -1 roll +2 copy gt { exch } if +a sub +/y2 ED +a add +/y1 ED +2 copy gt { exch } if +a sub +/x2 ED +a add +/x1 ED +1 index 0 eq {pop pop ParallelogramA } { OvalFrame } ifelse}> +% +% +% -------------- the arrow part ------------- +% the original table +% \def\pst@arrowtable{,<->,<<->>,>-<,>>-<<,(-),[-],)-(,]-[,|>-<|} +% +% v : Vee arrow (inside) v,V,f and F by Christophe FOUREY +% V : Vee arrow (outside) +% f : Filled vee arrow (inside) +% F : Filled vee arrow (outside) +\edef\pst@arrowtable{\pst@arrowtable,v-v,V-V,f-f,F-F,t-t,T-T} + +% Vee arrow +\define@key[psset]{pstricks-add}{veearrowlength}[3mm]{\pst@getlength{#1}\psk@veearrowlength} +\psset[pstricks-add]{veearrowlength=3mm} % default projected length +\define@key[psset]{pstricks-add}{veearrowangle}[30]{\pst@getangle{#1}\psk@veearrowangle} +\psset[pstricks-add]{veearrowangle=30} % default angle +\define@key[psset]{pstricks-add}{veearrowlinewidth}[0.35mm]{\pst@getlength{#1}\psk@veearrowlinewidth} +\psset[pstricks-add]{veearrowlinewidth=0.35mm} % default vee arrow line width + +% Filled vee arrow +\define@key[psset]{pstricks-add}{filledveearrowlength}[3mm]{\pst@getlength{#1}\psk@filledveearrowlength} +\psset[pstricks-add]{filledveearrowlength=3mm} % default projected length +\define@key[psset]{pstricks-add}{filledveearrowangle}[15]{\pst@getangle{#1}\psk@filledveearrowangle} +\psset[pstricks-add]{filledveearrowangle=15} % default angle +\define@key[psset]{pstricks-add}{filledveearrowlinewidth}[0.35mm]{\pst@getlength{#1}\psk@filledveearrowlinewidth} +\psset[pstricks-add]{filledveearrowlinewidth=0.35mm} % default vee arrow line width +\define@key[psset]{pstricks-add}{arrowlinestyle}[solid]{% + \@ifundefined{psls@#1}% + {\@pstrickserr{Line style `#1' not defined}\@eha}% + {\def\psarrowlinestyle{#1}}} +\psset[pstricks-add]{arrowlinestyle=solid} % default +\pst@def{VeeArrow}<% + 1 setlinecap % round caps + 1 setlinejoin % round join + setlinewidth % vee arrow line width + /y ED % projected length + 2 div /a ED % angle (divide by 2) + /t ED % false = inside, true = outside + a sin a cos div y mul /x ED % perpendicular length : x=tan(a).y + t { 1 -1 scale } if % if outside : symmetry + x neg y moveto % point #1 + 0 0 L % point #2 + x y L % point #3 + { closepath gsave fill grestore } if % if filled : close and fill + \@nameuse{psls@\psarrowlinestyle} + stroke % draw line + 0 t { y 2 mul } { 0 } ifelse moveto> % if outside : twice longer line + +% VeeArrow : filled? outside? (total) angle (projected) length (arrow) line width + +\@namedef{psas@v}{% + false false \psk@veearrowangle \psk@veearrowlength \psk@veearrowlinewidth \tx@VeeArrow} +\@namedef{psas@V}{% + false true \psk@veearrowangle \psk@veearrowlength \psk@veearrowlinewidth \tx@VeeArrow} +\@namedef{psas@f}{% + true false \psk@filledveearrowangle \psk@filledveearrowlength \psk@filledveearrowlinewidth \tx@VeeArrow} +\@namedef{psas@F}{% + true true \psk@filledveearrowangle \psk@filledveearrowlength \psk@filledveearrowlinewidth \tx@VeeArrow} + +% And An another arrowhead +% architectural tick / oblique arrow + +% Tick arrow +\define@key[psset]{pstricks-add}{tickarrowlength}[1.5mm]{\pst@getlength{#1}\psk@tickarrowlength} +\psset[pstricks-add]{tickarrowlength=1.5mm} % default projected length +\define@key[psset]{pstricks-add}{tickarrowlinewidth}[0.35mm]{\pst@getlength{#1}\psk@tickarrowlinewidth} +\psset[pstricks-add]{tickarrowlinewidth=0.35mm} % default tick arrow line width + +\pst@def{TickArrow}<% + 1 setlinecap % round caps + 1 setlinejoin % round join + setlinewidth % tick line width + /y ED % projected length + /t ED % false = normal, true = reversed + t { 1 -1 scale } if % if reversed : symmetry + y neg y moveto % point #1 + y y neg L % point #2 + \@nameuse{psls@\psarrowlinestyle} + stroke % draw line + 0 0 moveto> % origin + +\@namedef{psas@t}{ false \psk@tickarrowlength \psk@tickarrowlinewidth \tx@TickArrow } +\@namedef{psas@T}{ true \psk@tickarrowlength \psk@tickarrowlinewidth \tx@TickArrow } +% +% HookLeft/RightArrow +\newdimen\pshooklength +\newdimen\pshookwidth +\define@key[psset]{pstricks-add}{hooklength}[3mm]{\pssetlength\pshooklength{#1}} +\define@key[psset]{pstricks-add}{hookwidth}[1mm]{\pssetlength\pshookwidth{#1}} +%\psset{hooklength=3mm,hookwidth=1mm} +% +\edef\pst@arrowtable{\pst@arrowtable,H-H,h-h} % add new arrow +\def\tx@RHook{RHook } % PostScript name +\def\tx@Rhook{Rhook } % PostScript name +\@namedef{psas@H}{% + /RHook { + /x ED % hook width + /y ED % hook length + /z CLW 2 div def % save it + x y moveto % goto first point + x 0 0 0 0 y + curveto % draw Bezier + stroke + 0 y moveto % define current point + } def + \pst@number\pshooklength + \pst@number\pshookwidth + \tx@RHook +} +\@namedef{psas@h}{% + /Rhook { + CLW mul % size * CLW + add dup % +length size*CLW+length size*CLW+length + 2 div /w ED % (size*CLW+length)/2 -> w + mul dup /h ED mul % (size*CLW+length) + /a ED + w neg h abs moveto 0 0 L + gsave + stroke grestore + } def + 0 \psk@arrowlength \psk@arrowsize \tx@Rhook +} +% New parameter "arrowfill", with default as "true" +\define@boolkey[psset]{pstricks-add}[ps]{ArrowFill}[true]{} +% +% Modification of the PostScript macro Arrow to choose to fill or not the arrow +% (it require to restore the current linewidth, despite of the scaling) +\pst@def{Arrow}<{% + CLW mul add dup 2 div + /w ED mul dup + /h ED mul + /a ED { 0 h T 1 -1 scale } if + gsave + \ifpsArrowFill\else\pst@number\pslinewidth \pst@arrowscale\space div SLW \fi + w neg h moveto + 0 0 L w h L w neg a neg rlineto + \ifpsArrowFill gsave fill grestore \else gsave closepath stroke grestore \fi + grestore + 0 h a sub moveto +}> +% +\define@key[psset]{pstricks-add}{nArrowsA}[2]{\def\psk@nArrowsA{#1}} +\define@key[psset]{pstricks-add}{nArrowsB}[2]{\def\psk@nArrowsB{#1}} +\define@key[psset]{pstricks-add}{nArrows}[2]{\def\psk@nArrowsA{#1}\def\psk@nArrowsB{#1}} +\psset{nArrows=2} +% +\@namedef{psas@>>}{% + \psk@nArrowsA\space 1 sub { + false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow + 0 h a sub T + } repeat + gsave + newpath + false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow + CP + grestore + moveto +} +% +\@namedef{psas@<<}{% + true \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow + 0 h neg a add T + \psk@nArrowsB\space 2 sub { + false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow + 0 h neg a add T + } repeat + false \psk@arrowinset \psk@arrowlength \psk@arrowsize \tx@Arrow + 0 h a 5 mul 2 div sub moveto +} +% +% DG addition begin - Dec. 18/19, 1997 and Oct. 11, 2002 +% Adapted from \psset@arrows +\define@key[psset]{pstricks-add}{ArrowInside}{% + \def\pst@tempArrow{#1}% + \ifx\pst@tempArrow\@empty \def\psk@ArrowInside{} % + \else% + \begingroup% + \pst@activearrows% + \xdef\pst@tempg{<#1}% + \endgroup% + \expandafter\psset@@ArrowInside\pst@tempg\@empty-\@empty\@nil% + \if@pst\else\@pstrickserr{Bad intermediate arrow specification: #1}\@ehpa\fi% + \fi% +} +% Adapted from \psset@@arrows +\def\psset@@ArrowInside#1-#2\@empty#3\@nil{% + \@psttrue + \def\next##1,#1-##2,##3\@nil{\def\pst@tempg{##2}}% + \expandafter\next\pst@arrowtable,#1-#1,\@nil + \@ifundefined{psas@#2}% + {\@pstfalse\def\psk@ArrowInside{}}% + {\def\psk@ArrowInside{#2}}% +} +% Default value empty +\psset{ArrowInside={}} +% Modified version of \pst@addarrowdef +\def\pst@addarrowdef{% + \addto@pscode{% + /ArrowA { + \ifx\psk@arrowA\@empty + \pst@oplineto + \else + \pst@arrowdef{A} + moveto + \fi + } def + /ArrowB { \ifx\psk@arrowB\@empty \else \pst@arrowdef{B} \fi } def +% DG addition + /ArrowInside { + \ifx\psk@ArrowInside\@empty \else \pst@arrowdefA{Inside} \fi + } def + }% +} +% Adapted from \pst@arrowdef +\def\pst@arrowdefA#1{% + \ifnum\pst@repeatarrowsflag>\z@ /Arrow#1c [ 6 2 roll ] cvx def Arrow#1c\fi + \tx@BeginArrow + \psk@arrowscale + \@nameuse{psas@\@nameuse{psk@Arrow#1}} + \tx@EndArrow% +} +% ArrowInsidePos parameter (default value 0.5) +\define@key[psset]{pstricks-add}{ArrowInsidePos}[0.5]{\pst@checknum{#1}\psk@ArrowInsidePos}% +%\psset{ArrowInsidePos=0.5} +% +% +% Redefinition of the PostScript /Line macro to print the intermediate +% arrow on each segment of the line +% +\define@key[psset]{pstricks-add}{ArrowInsideNo}[1]{\pst@checknum{#1}\psk@ArrowInsideNo}% hv 20031001 +\define@key[psset]{pstricks-add}{ArrowInsideOffset}[0]{\pst@checknum{#1}\psk@ArrowInsideOffset}% hv 20031001 +%\psset{ArrowInsideNo=1,ArrowInsideOffset=0} +% +\def\arrowType@H{H} +\pst@def{Line}< + NArray n 0 eq not { n 1 eq { 0 0 /n 2 def } if + (\psk@ArrowInside) length 0 gt { + \ifx\psk@arrowA\arrowType@H % do we have a Hook arrow at the beginning? + \pst@number\pshooklength % yes + \else + \psk@arrowsize\space CLW mul add dup \psk@arrowlength\space mul exch \psk@arrowinset mul neg add + \fi + /arrowlength exch def + 4 copy % copy all four values for the arrow line + /y1 ED /x1 ED /y2 ED /x2 ED % save them + /Alpha y2 y1 sub x2 x1 sub Atan def % the gradient of the line +% 2 copy /y1 ED /x1 ED ArrowA x1 y1 + ArrowA % draw arrowA + x1 Alpha cos arrowlength mul add % dx add + y1 Alpha sin arrowlength mul add % dy add, to get the current point at the end of the arrow tip + /n n 1 sub def + n { + 4 copy + /y1 ED /x1 ED /y2 ED /x2 ED + x1 y1 + \psk@ArrowInsidePos\space 1 gt { + /Alpha y2 y1 sub x2 x1 sub Atan def + /ArrowPos \psk@ArrowInsideOffset\space def + /dArrowPos \psk@ArrowInsidePos\space abs def +% /Length x2 x1 sub y2 y1 sub Pyth def + \psk@ArrowInsideNo\space cvi { + /ArrowPos ArrowPos dArrowPos add def +% ArrowPos Length gt { exit } if + x1 Alpha cos ArrowPos mul add + y1 Alpha sin ArrowPos mul add + ArrowInside + pop pop + } repeat + }{ + /ArrowPos \psk@ArrowInsideOffset\space def + /dArrowPos \psk@ArrowInsideNo 1 gt {% + 1.0 \psk@ArrowInsideNo 1.0 add div + }{\psk@ArrowInsidePos } ifelse def + \psk@ArrowInsideNo\space cvi { + /ArrowPos ArrowPos dArrowPos add def + x2 x1 sub ArrowPos mul x1 add + y2 y1 sub ArrowPos mul y1 add + ArrowInside + pop pop + } repeat + } ifelse + pop pop Lineto + } repeat + }{ ArrowA /n n 2 sub def n { Lineto } repeat } ifelse + CP 4 2 roll ArrowB L pop pop } if > +% +% Redefinition of the PostScript /Polygon macro to print the intermediate +% arrow on each segment of the line +\pst@def{Polygon}<{% + NArray n 2 eq { 0 0 /n 3 def } if + n 3 lt { + n { pop pop } repeat + }{ + n 3 gt { CheckClosed } if + n 2 mul -2 roll + /y0 ED + /x0 ED + /y1 ED + /x1 ED + /xx1 x1 def + /yy1 y1 def + x1 y1 + /x1 x0 x1 add 2 div def + /y1 y0 y1 add 2 div def + x1 y1 moveto + /n n 2 sub def + /drawArrows { + x11 y11 + \psk@ArrowInsidePos\space 1 gt { + /Alpha y12 y11 sub x12 x11 sub atan def + /ArrowPos \psk@ArrowInsideOffset\space def + /Length x12 x11 sub y12 y11 sub Pyth def + /dArrowPos \psk@ArrowInsidePos\space abs def + { + /ArrowPos ArrowPos dArrowPos add def + ArrowPos Length gt { exit } if + x11 Alpha cos ArrowPos mul add + y11 Alpha sin ArrowPos mul add + currentdict /ArrowInside known { ArrowInside } if + pop pop + } loop + }{ + /ArrowPos \psk@ArrowInsideOffset\space def + /dArrowPos \psk@ArrowInsideNo\space 1 gt {% + 1.0 \psk@ArrowInsideNo\space 1.0 add div + }{ \psk@ArrowInsidePos } ifelse def + \psk@ArrowInsideNo\space cvi { + /ArrowPos ArrowPos dArrowPos add def + x12 x11 sub ArrowPos mul x11 add + y12 y11 sub ArrowPos mul y11 add + currentdict /ArrowInside known { ArrowInside } if + pop pop + } repeat + } ifelse + pop pop Lineto + } def + n { + 4 copy + /y11 ED /x11 ED /y12 ED /x12 ED + drawArrows + } repeat + x1 y1 x0 y0 + 6 4 roll + 2 copy + /y11 ED /x11 ED /y12 y0 def /x12 x0 def + drawArrows + /y11 y0 def /x11 x0 def /y12 yy1 def /x12 xx1 def + drawArrows + pop pop + closepath + } ifelse % +}> +% +% +% Redefinition of the PostScript /OpenBezier macro to print the intermediate +% arrow +\pst@def{OpenBezier}<{% + /dArrowPos \psk@ArrowInsideNo 1 gt {% + 1.0 \psk@ArrowInsideNo 1.0 add div + }{ \psk@ArrowInsidePos } ifelse def + BezierNArray + n 1 eq { pop pop + }{ 2 copy + /y0 ED /x0 ED + ArrowA + n 4 sub 3 idiv { 6 2 roll 4 2 roll curveto } repeat + 6 2 roll + 4 2 roll + ArrowB + /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED + /cx x1 x0 sub 3 mul def + /cy y1 y0 sub 3 mul def + /bx x2 x1 sub 3 mul cx sub def + /by y2 y1 sub 3 mul cy sub def + /ax x3 x0 sub cx sub bx sub def + /ay y3 y0 sub cy sub by sub def + /getValues { + ax t0 3 exp mul bx t0 t0 mul mul add cx t0 mul add x0 add + ay t0 3 exp mul by t0 t0 mul mul add cy t0 mul add y0 add + ax t 3 exp mul bx t t mul mul add cx t mul add x0 add + ay t 3 exp mul by t t mul mul add cy t mul add y0 add + } def + /getdL { + getValues + 3 -1 roll sub 3 1 roll sub Pyth + } def + /CurveLength { + /u 0 def + /du 0.01 def + 0 100 { + /t0 u def + /u u du add def + /t u def + getdL add + } repeat } def + /GetArrowPos { + /ende \psk@ArrowInsidePos\space 1 gt + {ArrowPos} + {ArrowPos CurveLength mul} ifelse def + /u 0 def + /du 0.01 def + /sum 0 def + { /t0 u def + /u u du add def + /t u def + /sum getdL sum add def + sum ende gt {exit} if + } loop u + } def + /ArrowPos \psk@ArrowInsideOffset\space def + /loopNo \psk@ArrowInsidePos\space 1 gt {% + CurveLength \psk@ArrowInsidePos\space div cvi + }{ \psk@ArrowInsideNo } ifelse def + loopNo cvi { + /ArrowPos ArrowPos dArrowPos add def + /t GetArrowPos def + /t0 t 0.95 mul def + getValues + ArrowInside pop pop pop pop + } repeat + x1 y1 x2 y2 x3 y3 curveto + } ifelse +}> +% +% Redefinition of the PostScript /NCLine macro to print the intermediate +% arrow of the line +\pst@def{NCLine}<{% + NCCoor + tx@Dict begin + ArrowA CP 4 2 roll ArrowB + 4 copy + /y2 ED /x2 ED /y1 ED /x1 ED + x1 y1 + \psk@ArrowInsidePos\space 1 gt { + /Alpha y2 y1 sub x2 x1 sub atan def + /ArrowPos \psk@ArrowInsideOffset\space def + /Length x2 x1 sub y2 y1 sub Pyth def + /dArrowPos \psk@ArrowInsidePos\space abs def + {% + /ArrowPos ArrowPos dArrowPos add def + ArrowPos Length gt { exit } if + x1 Alpha cos ArrowPos mul add + y1 Alpha sin ArrowPos mul add + ArrowInside + pop pop + } loop + }{% + /ArrowPos \psk@ArrowInsideOffset\space def + /dArrowPos \psk@ArrowInsideNo 1 gt {% + 1.0 \psk@ArrowInsideNo 1.0 add div + }{ \psk@ArrowInsidePos } ifelse def + \psk@ArrowInsideNo\space cvi { + /ArrowPos ArrowPos dArrowPos add def + x2 x1 sub ArrowPos mul x1 add + y2 y1 sub ArrowPos mul y1 add + ArrowInside + pop pop + } repeat + } ifelse + pop pop lineto pop pop + end% +}> +% +\pst@def{NCCurve}<{% + GetEdgeA GetEdgeB + xA1 xB1 sub yA1 yB1 sub + Pyth 2 div dup 3 -1 roll mul + /ArmA ED + mul + /ArmB ED + /ArmTypeA 0 def + /ArmTypeB 0 def + GetArmA GetArmB + xA2 yA2 xA1 yA1 + 2 copy + /y0 ED /x0 ED + tx@Dict begin + ArrowA + end + xB2 yB2 xB1 yB1 + tx@Dict begin + ArrowB + end + /y3 ED /x3 ED /y2 ED /x2 ED /y1 ED /x1 ED + /cx x1 x0 sub 3 mul def + /cy y1 y0 sub 3 mul def + /bx x2 x1 sub 3 mul cx sub def + /by y2 y1 sub 3 mul cy sub def + /ax x3 x0 sub cx sub bx sub def + /ay y3 y0 sub cy sub by sub def + /getValues { + ax t0 3 exp mul bx t0 t0 mul mul add cx t0 mul add x0 add + ay t0 3 exp mul by t0 t0 mul mul add cy t0 mul add y0 add + ax t 3 exp mul bx t t mul mul add cx t mul add x0 add + ay t 3 exp mul by t t mul mul add cy t mul add y0 add + } def + /getdL { + getValues + 3 -1 roll sub 3 1 roll sub Pyth + } def + /CurveLength { + /u 0 def + /du 0.01 def + 0 100 { + /t0 u def + /u u du add def + /t u def + getdL add + } repeat } def + /GetArrowPos { + /ende \psk@ArrowInsidePos\space 1 gt {ArrowPos}{ArrowPos CurveLength mul} ifelse def + /u 0 def + /du 0.01 def + /sum 0 def + { + /t0 u def + /u u du add def + /t u def + /sum getdL sum add def + sum ende gt {exit} if + } loop u + } def + /dArrowPos \psk@ArrowInsideNo 1 gt {% + 1.0 \psk@ArrowInsideNo 1.0 add div + }{ \psk@ArrowInsidePos } ifelse def + /ArrowPos \psk@ArrowInsideOffset\space def + /loopNo \psk@ArrowInsidePos\space 1 gt {% + CurveLength \psk@ArrowInsidePos\space div cvi + }{ \psk@ArrowInsideNo } ifelse def + loopNo cvi { + /ArrowPos ArrowPos dArrowPos add def + /t GetArrowPos def + /t0 t 0.95 mul def + getValues + ArrowInside pop pop pop pop + } repeat + x1 y1 x2 y2 x3 y3 curveto + /LPutVar [ xA1 yA1 xA2 yA2 xB2 yB2 xB1 yB1 ] cvx def + /LPutPos { t LPutVar BezierMidpoint } def + /HPutPos { { HPutLines } HPutCurve } def + /VPutPos { { VPutLines } HPutCurve } def +}> +% +\def\parseRP#1;#2;#3\@nil{%check whether arg of refpt contains ; + \def\arg@A{#1}\def\arg@B{#2}} +% +\def\Put{\pst@object{Put}}% +\def\Put@i{\@ifnextchar({\Put@ii{}}{\Put@ii}}% +\def\Put@ii#1(#2)#3{{% + \pst@killglue% + \use@par% + \expandafter\parseRP#1;;\@nil%sets \arg@A, \arg@B + \ifx\arg@B\@empty% use \rput + \edef\arg@A{\if@star*\fi\ifx\arg@A\@empty\else[\arg@A]\fi}% + \expandafter\rput\arg@A(>#2){#3} + \else% use \uput + \edef\arg@A{\if@star*\fi% + \ifx\arg@A\@empty\else{\arg@A}\fi% + \ifx\arg@B\@empty[0]\else[\arg@B]\fi}% + \expandafter\uput\arg@A(>#2){#3} + \fi}\ignorespaces}% + +% Modify pst@rot so that a rotation may be specified with a node or ps code +% +\define@key[psset]{pstricks-add}{Os}[0]{\def\PST@Os{#1}} +\psset{Os=0}% +\define@key[psset]{pstricks-add}{Ds}[1]{\def\PST@Ds{#1}} +\psset{Ds=1}% +\define@key[psset]{pstricks-add}{metricInitValue}[0]{\def\PST@metricInitValue{#1}} +\psset{metricInitValue=0}% +\define@boolkey[psset]{pstricks-add}[PST@]{metricFunction}[true]{}%use \ifPST@metricFunction +\psset{metricFunction=false}% +\def\pscurvepoints{\pst@object{pscurvepoints}}% +\def\pscurvepoints@i#1#2#3#4{{%optional [plotpoints=xx] +% #1=tmin,#2=tmax,#3=function (of t),#4=array root name, + \pst@killglue% + \use@par% + \edef\my@tempA{#3}% x(t) y(t) expanded + \expandafter\testAlg\my@tempA|\@nil% + \pst@Verb{ % so we can use definitions from tx@Dict + /unitratio \pst@number\psyunit \pst@number\psxunit div def + /unitratiosq unitratio dup mul def + /t0 #1 def + /t1 #2 def + t1 t0 sub \psk@plotpoints\space div /dt exch def }% + \pst@cntc=\psk@plotpoints\relax%\psk@plotpoints=plotpoints-1 + \pst@cntb=\pst@cntc\relax%\psk@plotpoints=plotpoints-1 + \advance\pst@cntc by \@ne\relax%=plotpoints + \ifx\my@tempD\@empty\pst@Verb{ /Func (#3) cvx def }% + \else\pst@Verb{ /Func (#3 ) AlgParser cvx def }% + \fi% + \pst@Verb{ + /#4.X \the\pst@cntc\space array def + /#4.Y \the\pst@cntc\space array def % + /#4Delta.X \the\pst@cntc\space array def % + /#4Delta.Y \the\pst@cntc\space array def % + /#4Normal.X \the\pst@cntc\space array def % + /#4Normal.Y \the\pst@cntc\space array def % + /t #1 def Func 2 copy /priory ED /priorx ED #4.Y 0 3 -1 roll put #4.X 0 3 -1 roll put % + 1 1 \the\pst@cntb\space { dup /j ED dt mul #1 add /t ED Func %x y on stack + 2 copy priory sub dup #4Delta.Y j 3 -1 roll put % x y x y-priory + unitratiosq mul neg #4Normal.X j 3 -1 roll put % x y x + priorx sub dup #4Delta.X j 3 -1 roll put % x y x-priorx + #4Normal.Y j 3 -1 roll put % x y + 2 copy /priory ED /priorx ED % x y + #4.Y j 3 -1 roll put #4.X j 3 -1 roll put } for % + }% + \expandafter\xdef \csname #4pointcount\endcsname {\psk@plotpoints}% +% \typeout{Created points #40 .. #4\psk@plotpoints}% +}\ignorespaces}% +% +%code to place ticks along polyline +\def\pspolylineticks{\pst@object{pspolylineticks}}% +\def\pspolylineticks@i#1{\@ifnextchar[{\pspolylineticks@ii{#1}}{\pspolylineticks@ii{#1}[]}}% +\newcount\pst@cntC% +\def\pspolylineticks@ii#1[#2]#3#4#5{{% +%#1= root name,#2=pscode (optional),#3=metric function,#4=first tick,#5=tick count +% Metric function may be a function of x, y (keyword metricFunction) +% or a function of x, y, dx, dy, ds requiring incremental build + \addbefore@par{arrows=-,linewidth=\psk@ytickwidth\pslinewidth}% + \use@par% + \pst@killglue%there's a leak that can occur here with ticksize--fixed in recent pstricks.tex + \pst@cntC=\expandafter\csname #1pointcount\endcsname\relax% + \pst@cntb=\pst@cntC\advance\pst@cntb\m@ne\relax% + \pst@cntd=\pst@cntC\advance\pst@cntd\@ne\relax% + \pst@Verb{ % so we can use definitions from tx@Dict in pstricks.pro + /TDict 20 dict def TDict begin % + /Func (#3) cvx def /sarray \the\pst@cntd\space array def % + #2 + \ifPST@metricFunction + 0 1 #1.X length 1 sub { + /j ED sarray j % + #1.X j get /x ED #1.Y j get /y ED Func put + } for % + \else %build by increments + sarray 0 \PST@metricInitValue\space put % + 1 1 #1.X length 1 sub { + /j ED sarray j % + #1.X j 1 sub get + /x ED #1.Y j 1 sub get + /y ED #1Delta.X j get + /dx ED #1Delta.Y j get + /dy ED /ds dx dup mul dy dup mul add sqrt def % + Func sarray j 1 sub get add put + } for % + \fi %\ifPSTfunctionMetric + \ifnum\Pst@Debug>0 + /str 10 string def + /tmpar [(Metric range: [) () (, ) () (])] def % + tmpar 1 sarray 0 get str cvs put + /str 10 string def + tmpar 3 sarray \the\pst@cntC\space get str cvs put tmpar + tx@NodeDict begin concatstringarray = end % + \fi % end debug +%compute ticks + /nl 0 def /nu \the\pst@cntC\space def + /smin sarray 0 get def + /smax sarray nu get def + /Os \ifx\PST@Os\@empty smin \else \PST@Os\space \fi def % + /Ds \ifx\PST@Ds\@empty smax Os sub 10 div \else \PST@Ds\space \fi def % + /scount smax Os sub Ds div cvi def % + /tarray scount 1 add array def % + /#1Tick.X scount 1 add array def % + /#1Tick.Y scount 1 add array def % + /#1TickN.X scount 1 add array def % + /#1TickN.Y scount 1 add array def % + 0 1 scount { dup Ds mul Os add tarray 3 1 roll put } for %tick positions in tarray + % find the corresponding s values using binary search + 0 1 scount { + dup tarray exch get /s exch def /j exch def %sought metric value,index + /m nl def /n nu def /k nl nu add 2 div cvi def 20 { s sarray k get lt { % + /n k def /k k m add 2 div cvi def }{ /m k def /nl k def /k k n add 2 div cvi def } ifelse % + n 1 sub m le { /nl m def exit } if } repeat % + sarray n get sarray m get dup 3 1 roll % sm sn sm + sub dup 0 le { pop pop 0 }{%sm sn-sm + exch %sn-sm sm + s sub neg exch div } ifelse % s->(s-sm)/(sn-sm) + dup #1Delta.X m 1 add get mul #1.X m get add #1Tick.X j 3 -1 roll put % s on stack + #1Delta.Y m 1 add get mul #1.Y m get add #1Tick.Y j 3 -1 roll put % + #1TickN.X j #1Normal.X m 1 add get put #1TickN.Y j #1Normal.Y m 1 add get put % + } for % + \ifnum\Pst@Debug>0 + /tmpar 2 array def + /str 4 string def tmpar 0 (Created data for points #1Tick0..#1Tick) put + tmpar 1 scount str cvs put tmpar tx@NodeDict begin concatstringarray = end + \fi% + end }% end pst@Verb +%Draw ticks +\multido{\iA=#4+1}{#5}{% + \pnode(! TDict begin \iA\space scount gt + { 1 0 /VV ED /UU ED 0 0 } + { #1TickN.X \iA\space get #1TickN.Y \iA\space get /VV ED /UU ED #1Tick.X \iA\space get #1Tick.Y \iA\space get } ifelse + 2 copy /YY ED /XX ED end){#1Tick\iA}% + \pnode(! TDict begin UU VV end ){#1Normal\iA}% + \pnode(! TDict begin VV UU neg unitratiosq div end ){#1Tangent\iA}% + \edef\cmd{\noexpand\psline(\the\pst@yticksizeA;{(! TDict begin UU VV end )})(\the\pst@yticksizeB;{(! TDict begin UU VV end )})}% + \pscustom{\translate(! TDict begin XX YY end)\cmd}}% +}\ignorespaces}% +% +\define@key[psset]{pstricks-add}{randomPoints}[1000]{\def\psk@randomPoints{#1}} +\define@boolkey[psset]{pstricks-add}[Pst@]{color}[true]{} +\psset{randomPoints=1000,color=false} +% +\def\psRandom{\def\pst@par{}\pst@object{psRandom}}% hv 2004-11-12 +\def\psRandom@i{\@ifnextchar({\psRandom@ii}{\psRandom@iii(0,0)(1,1)}} +\def\psRandom@ii(#1){\@ifnextchar({\psRandom@iii(#1)}{\psRandom@iii(0,0)(#1)}} +\def\psRandom@iii(#1)(#2)#3{% + \def\pst@tempA{#3}% + \ifx\pst@tempA\pst@empty\psclip{\psframe(#2)}\else\psclip{#3}\fi + \pst@getcoor{#1}\pst@tempA + \pst@getcoor{#2}\pst@tempB + \begin@SpecialObj + \addto@pscode{ + \pst@tempA\space /yMin exch def + /xMin exch def + \pst@tempB\space /yMax exch def + /xMax exch def + /dy yMax yMin sub def + /dx xMax xMin sub def + rrand srand % initializes the random generator + /getRandReal { rand 2147483647 div } def + \psk@dotsize % defines /DS ... def + \@nameuse{psds@\psk@dotstyle} + \psk@randomPoints { + \ifPst@color getRandReal getRandReal getRandReal setrgbcolor \fi + getRandReal dx mul xMin add + getRandReal dy mul yMin add + Dot + \ifx\psk@fillstyle\psfs@solid fill \fi stroke + } repeat + }% + \end@SpecialObj + \endpsclip + \ignorespaces +} +% +\def\psComment{\def\pst@par{}\pst@object{psComment}} +\def\psComment@i{\pst@getarrows\psComment@ii} +\def\psComment@ii(#1)(#2)#3{\@ifnextchar[ + {\psComment@iii(#1)(#2){#3}} + {\psComment@iii(#1)(#2){#3}[\ncline]}} +\def\psComment@iii(#1)(#2)#3[#4]{\@ifnextchar[ + {\psComment@iv(#1)(#2){#3}[#4]} + {\psComment@iv(#1)(#2){#3}[#4][\rput]}} +\def\psComment@iv(#1)(#2)#3[#4][#5]{% + \pnode(#1){comment@1} + \pnode(#2){comment@2} + \ifx\relax#4\relax\let\pst@ConnectionCommand\ncline + \else\let\pst@ConnectionCommand#4\fi + \ifx\relax#5\relax\let\pst@PutCommand\rput + \else\let\pst@PutCommand#5\fi + \addbefore@par{npos=0}% + \begin@SpecialObj% + \pst@ConnectionCommand{comment@1}{comment@2} + \if@star\pst@PutCommand*(#1){#3}\else\pst@PutCommand(#1){#3}\fi + \end@SpecialObj% + \ignorespaces% +} +% +\def\tx@MovetoByHand{ tx@addDict begin MovetoByHand end } +\def\tx@LinetoByHand{ tx@addDict begin LinetoByHand end } +%/amplHand {.8} def +%/dtHand 2 def + +\def\pslineByHand{\def\pst@par{}\pst@object{pslineByHand}} +\def\pslineByHand@i{% + \addbefore@par{VarStepEpsilon=2,varsteptol=0.8} + \pst@getarrows{% + \begin@OpenObj + \pst@getcoors[\pslineByHand@ii}} +\def\pslineByHand@ii{% + \addto@pscode{ + tx@addDict begin + /dtHand \psk@VarStepEpsilon\space def + /amplHand \psk@varsteptol\space def +% \pst@cp % current point + \tx@setlinejoin % hv 2007-10-13 + MovetoByHand + counttomark 2 div /maxLines ED + 1 1 maxLines { pop LinetoByHand } for + end + }% + \end@OpenObj% +} +% +\def\psRelNode{\pst@object{psRelNode}} +\def\psRelNode@i(#1)(#2)#3#4{{% A - B - factor - node name + \use@par + \pst@getcoor{#1}\pst@tempA% + \pst@getcoor{#2}\pst@tempB% + \pnode(! + \pst@tempA /YA exch \pst@number\psyunit div def + /XA exch \pst@number\psxunit div def + \pst@tempB /YB exch \pst@number\psyunit div def + /XB exch \pst@number\psxunit div def + /AlphaStrich \psk@angleA\space def + /unit \pst@number\psyunit \pst@number\psxunit div def % yunit/xunit +% + /dx XB XA sub def + /dy YB YA sub \ifPst@trueAngle\space unit mul \fi\space def + /laenge dy dup mul dx dup mul add sqrt #3 mul def + /Alpha dy dx atan def + /beta Alpha AlphaStrich add def + laenge beta cos mul XA add + laenge beta sin mul \ifPst@trueAngle\space unit div \fi\space YA add ){#4}% +}} +% +\def\psRelLine{\def\pst@par{}\pst@object{psRelLine}} +\def\psRelLine@i{\@ifnextchar({\psRelLine@iii}{\psRelLine@ii}} +\def\psRelLine@ii#1{% + \addto@par{arrows=#1}% + \psRelLine@iii% +} +\def\psRelLine@iii(#1)(#2)#3#4{{ + \pst@killglue + \use@par + \psRelNode(#1)(#2){#3}{#4} + \psline(#1)(#4)% +}\ignorespaces} +% +% #1 options +% draw a parallel line to #2 #3 +% #2---------#3 +% #4----------#5(new node) +% #5 length of the line +% #6 node name +\def\psParallelLine{\def\pst@par{}\pst@object{psParallelLine}} +\def\psParallelLine@i{\@ifnextchar({\psParallelLine@iii}{\psParallelLine@ii}} +\def\psParallelLine@ii#1{\addto@par{arrows=#1}\psParallelLine@iii} +\def\psParallelLine@iii(#1)(#2)(#3)#4#5{{ + \pst@killglue + \use@par + \pst@getcoor{#1}\pst@tempA + \pst@getcoor{#2}\pst@tempB + \pst@getcoor{#3}\pst@tempC +% \pst@getlength{#4}\pst@dima + \pnode(!% + \pst@tempA /YA exch \pst@number\psyunit div def + /XA exch \pst@number\psxunit div def + \pst@tempB /YB exch \pst@number\psyunit div def + /XB exch \pst@number\psxunit div def + \pst@tempC /YC exch \pst@number\psyunit div def + /XC exch \pst@number\psxunit div def +% + /dx XB XA sub def + /dy YB YA sub def + /laenge dy dup mul dx dup mul add sqrt #4 mul def + /Alpha dy dx atan def + laenge Alpha cos mul XC add + laenge Alpha sin mul YC add ){#5}% + \psline(#3)(#5) +}\ignorespaces} +% +\def\psIntersectionPoint(#1)(#2)(#3)(#4)#5{% + \pst@getcoor{#1}\pst@tempA + \pst@getcoor{#2}\pst@tempB + \pst@getcoor{#3}\pst@tempC + \pst@getcoor{#4}\pst@tempd +\pnode(!% + \pst@tempA /YA exch \pst@number\psyunit div def + /XA exch \pst@number\psxunit div def + \pst@tempB /YB exch \pst@number\psyunit div def + /XB exch \pst@number\psxunit div def + \pst@tempC /YC exch \pst@number\psyunit div def + /XC exch \pst@number\psxunit div def + \pst@tempd /YD exch \pst@number\psyunit div def + /XD exch \pst@number\psxunit div def + /dY1 YB YA sub def + /dX1 XB XA sub def + /dY2 YD YC sub def + /dX2 XD XC sub def + dX1 abs 0.01 lt { + /m2 dY2 dX2 div def + XA dup XC sub m2 mul YC add + }{ + dX2 abs 0.01 lt { + /m1 dY1 dX1 div def + XC dup XA sub m1 mul YA add + }{% + /m1 dY1 dX1 div def + /m2 dY2 dX2 div def + m1 XA mul m2 XC mul sub YA sub YC add m1 m2 sub div dup + XA sub m1 mul YA add + } ifelse + } ifelse ){#5}% +} +% +\define@cmdkeys[psset]{pstricks-add}[PSTPSPNk@]{% Christophe Jorssen 2007 + blName,bcName,brName, + clName,ccName,crName, + tlName,tcName,trName}[]{}% +\psset[pstricks-add]{% + blName=PSPbl,bcName=PSPbc,brName=PSPbr, + clName=PSPcl,ccName=PSPcc,crName=PSPcr, + tlName=PSPtl,tcName=PSPtc,trName=PSPtr} +\def\psDefPSPNodes{\def\pst@par{}\pst@object{psDefPSPNodes}} +\def\psDefPSPNodes@i{% + \pst@killglue + \begingroup + \use@par + \expandafter\psDefPSPNodes@ii\pic@coor} +% +\def\psDefPSPNodes@ii(#1)(#2)(#3){% +% \pnode(#1){PSPN@temp}\pnode([nodesep=.75,angle=45]PSPN@temp){\PSTPSPNk@blName} +% \pnode(#3){PSPN@temp}\pnode([nodesep=.75,angle=-135]PSPN@temp){\PSTPSPNk@trName} + \pnode(#1){PSPN@temp}\pnode([angle=45]PSPN@temp){\PSTPSPNk@blName} + \pnode(#3){PSPN@temp}\pnode([angle=-135]PSPN@temp){\PSTPSPNk@trName} + \pnode(\PSTPSPNk@blName|\PSTPSPNk@trName){\PSTPSPNk@tlName} + \pnode(\PSTPSPNk@trName|\PSTPSPNk@blName){\PSTPSPNk@brName} + \ncline[linestyle=none]{\PSTPSPNk@blName}{\PSTPSPNk@tlName} + \ncput[npos=.5]{\pnode{\PSTPSPNk@clName}} + \ncline[linestyle=none]{\PSTPSPNk@blName}{\PSTPSPNk@brName} + \ncput[npos=.5]{\pnode{\PSTPSPNk@bcName}} + \pnode(\PSTPSPNk@brName|\PSTPSPNk@clName){\PSTPSPNk@crName} + \pnode(\PSTPSPNk@bcName|\PSTPSPNk@trName){\PSTPSPNk@tcName} + \pnode(\PSTPSPNk@bcName|\PSTPSPNk@clName){\PSTPSPNk@ccName} + \endgroup + \ignorespaces} +% +%\define@key[psset]{pstricks-add}{method}{\def\psk@method{#1}}% defined in pst-plot +\define@key[psset]{pstricks-add}{whichabs}{\def\psk@whichabs{#1}}% +\define@key[psset]{pstricks-add}{whichord}{\def\psk@whichord{#1}}% +\define@key[psset]{pstricks-add}{plotfuncx}{\def\psk@plotfuncx{#1}}% +\define@key[psset]{pstricks-add}{plotfuncy}{\def\psk@plotfuncy{#1}}% +\define@key[psset]{pstricks-add}{expression}{\def\psk@expression{#1}}% +\define@boolkey[psset]{pstricks-add}[Pst@]{buildvector}[true]{}% +% +\define@key[psset]{pstricks-add}{varsteptol}{\def\psk@varsteptol{#1}}% +\define@key[psset]{pstricks-add}{adamsorder}{\def\psk@adamsorder{#1}}% +%\define@key[psset]{pstricks-add}{varstepincrease}{\def\psk@varstepincrease{#1}}% varrk4 +% +\define@key[psset]{pstricks-add}{StepType}{\pst@expandafter\psset@@StepType{#1}\@nil}% +\def\psset@@StepType#1#2\@nil{% + \ifx#1u\let\psk@StepType\@ne + \else\ifx#1l\let\psk@StepType\z@ + \else\ifx#1i\let\psk@StepType\thr@@ + \else\ifx#1s\let\psk@StepType\f@ur + \else\let\psk@StepType\tw@\fi\fi\fi\fi} +\psset{StepType=lower} % alternative StepType=upper/inf/sup/Riemann +% +\def\psStep{\def\pst@par{}\pst@object{psStep}} +\def\psStep@i(#1,#2)#3#4{% + \begin@ClosedObj% + \addto@pscode{ + \ifPst@algebraic /Func (#4) tx@addDict begin AlgParser end cvx def \fi + /x #1 def + /dx #2 #1 sub #3 div def + /scx { \pst@number\psxunit mul } def + /scy { \pst@number\psyunit mul } def + \ifcase\psk@StepType % 0->lower, height is always f(x) + x scx 0 moveto + #3 { + \ifPst@algebraic Func \else #4 \fi scy dup x scx exch lineto + /x x dx add def + x scx exch lineto x scx 0 lineto + } repeat + \or % 1-> upper, height is always f(x+dx) + x scx 0 moveto + #3 { + /x x dx add def + \ifPst@algebraic Func \else #4 \fi scy dup x dx sub scx exch lineto + x scx exch lineto x scx 0 lineto + } repeat + \or % 2-> Riemann + /eps3 100 def + /xMinMax [] def + /AMax [] def + /AMin [] def + /dt dx eps3 div def + #3 { + /Max \ifPst@algebraic Func \else #4 \fi def + /Min Max def + /t x def % save x value + eps3 { + \ifPst@algebraic Func \else #4 \fi + dup + Max lt { /Max exch def } { dup Min gt { /Min exch def }{ pop } ifelse } ifelse + /x x dt add def + } repeat + /x t def % restore + x scx Min scy Max scy xMinMax aload length 3 add array astore /xMinMax exch def + /x x dx add def + } repeat + /dx dx scx def + xMinMax aload length 3 div cvi { + /yMax ED /yMin ED /x ED + x yMin moveto dx 0 rlineto x dx add yMax lineto + dx neg 0 rlineto x yMin lineto } repeat + \or % 3->inf(imum) + x scx 0 moveto + #3 { + \ifPst@algebraic Func \else #4 \fi /y0 ED % left value f(x) + /xOld x def + /x x dx add def + \ifPst@algebraic Func \else #4 \fi /y1 ED % right value f(x+dx) + y0 y1 lt { y0 }{ y1 } ifelse % use infimum + scy dup xOld scx exch lineto + x scx exch lineto x scx 0 lineto + } repeat + \or % 4-> sup(remum) + x scx 0 moveto + #3 { + \ifPst@algebraic Func \else #4 \fi /y0 ED % left value f(x) + /x x dx add def + \ifPst@algebraic Func \else #4 \fi /y1 ED % right value f(x+dx) + y0 y1 gt { y0 }{ y1 } ifelse % use supremum + scy dup x dx sub scx exch lineto + x scx exch lineto x scx 0 lineto + } repeat + \fi + }% + \psk@fillstyle + \pst@stroke + \end@ClosedObj% +} +% +\define@key[psset]{pstricks-add}{Derive}{\def\psk@Derive{#1}}% +\define@boolkey[psset]{pstricks-add}[PST@]{Tnormal}[true]{} + +\psset[pstricks-add]{CMYK=true} +\def\@NOTEMPTY{NOT@EMPTY}%%dr 0606 +% +\def\psTangentLine{\def\pst@par{}\pst@object{psTangentLine}} +\def\psTangentLine@i(#1,#2)(#3,#4)(#5,#6)#7#8{% + \begin@OpenObj% + \addto@pscode{ + [[#1 dup dup mul exch 1 #2] + [#3 dup dup mul exch 1 #4] + [#5 dup dup mul exch 1 #6]] + SolveLinEqSystem + /abc ED + abc aload pop % a b c on stack + exch #7 % a c b x + mul add exch % c+b*x a + #7 dup mul mul add % a*x^2+b*x+c + /y0 ED % save value + abc aload pop pop exch % b a + #7 mul 2 mul add % b+2*a*x0=mTan + \ifPST@Tnormal + neg 1 exch div % -1/mTan=mOrth + #8 mul /dy ED % mOrth*dx=dy + [ + #7 #8 add y0 dy add \tx@ScreenCoor % x0+dx y0 +dy + #7 y0 \tx@ScreenCoor % x0 y0 + \else + dup % mTan mTan + #8 mul /dy1 ED % mTan*dx + #8 neg mul /dy2 ED % mTan*-dx + [ + #7 #8 add y0 dy1 add \tx@ScreenCoor % x0+dx y0 +dy1 + #7 #8 sub y0 dy2 add \tx@ScreenCoor % x0-dx y0 +dy2 + \fi + /Lineto /lineto load def + \ifshowpoints true \else false \fi + \tx@setlinejoin % + \tx@Line + }% + \end@OpenObj% + \pnode(! + [[#1 dup dup mul exch 1 #2][#3 dup dup mul exch 1 #4][#5 dup dup mul exch 1 #6]] + SolveLinEqSystem /abc ED + abc aload pop % a b c on stack + exch #7 % a c b x + mul add exch % c+b*x a + #7 dup mul mul add % a*x^2+b*x+c + /y0 ED % save value + #7 y0 ){OCurve}% + \pnode(! + [[#1 dup dup mul exch 1 #2][#3 dup dup mul exch 1 #4][#5 dup dup mul exch 1 #6]] + SolveLinEqSystem /abc ED + abc aload pop % a b c on stack + exch #7 % a c b x + mul add exch % c+b*x a + #7 dup mul mul add % a*x^2+b*x+c + /y0 ED % save value + abc aload pop pop exch % b a + #7 mul 2 mul add % b+2*a*x0=mTan + neg 1 exch div % -1/mTan=mOrth + #8 mul /dy ED % mOrth*dx=dy + #7 #8 add y0 dy add % x0+dx y0 +dy + ){ENormal}% + \pnode(! + [[#1 dup dup mul exch 1 #2][#3 dup dup mul exch 1 #4][#5 dup dup mul exch 1 #6]] + SolveLinEqSystem + /abc ED + abc aload pop % a b c on stack + exch #7 % a c b x + mul add exch % c+b*x a + #7 dup mul mul add % a*x^2+b*x+c + /y0 ED % save value + abc aload pop pop exch % b a + #7 mul 2 mul add % b+2*a*x0=mTan + #8 mul /dy1 ED % mTan*dx + #7 #8 add y0 dy1 add ){ETangent}% +\ignorespaces} + +\def\psplotTangent@x#1,#2,#3\@nil{% + \def\pst@tempLeft{#1}% + \def\pst@tempRight{#2}} +%% #1 : x value +%% #2 : delta x or x0,x1 +%% #3 : function +\def\psplotTangent{\@ifnextchar*{\@startrue\psplotTangent@i}{\@starfalse\psplotTangent@i*}} +\def\psplotTangent@i*{\@ifnextchar[{\psplotTangent@ii}{\psplotTangent@ii[]}} +\def\psplotTangent@ii[#1]#2#3#4{% + \pst@killglue% + \expandafter\psplotTangent@x#3,,\@nil\relax + \begingroup% + \ifx\relax#1\relax\else\psset{linestyle=solid,#1}\fi + \ifx\psk@Derive\@empty\ifPst@algebraic\def\psk@Derive{NOT@EMPTY}\fi\fi%%dr 0606 hv 1003 + \pst@addarrowdef + \addto@pscode{ + /F@pstplot \ifPst@algebraic (#4) tx@addDict begin AlgParser end cvx \else { #4 } \fi def % define function + \ifx\psk@Derive\@empty\else + \ifx\psk@Derive\@NOTEMPTY\else%%dr 0606 + /FDer@pstplot % do we have a derivation defined? + \ifPst@algebraic (\psk@Derive) tx@addDict begin AlgParser end cvx \else { \psk@Derive } \fi def % define derivation + \fi%%dr 0606 + \fi% + /@parametric false def %%dr 0606 + % first we calculate the origin + #2 dup /x ED /t ED tx@addDict begin mark F@pstplot end counttomark 1 gt % test, if we have parametricplot + %%{ /y ED /x ED } % if yes, then we have 2 values + { /y ED /x ED /@parametric true def } % if yes, then we have 2 values%%dr 0606 + { \ifPst@polarplot x \ifPst@algebraic RadtoDeg \fi PtoC /y ED /x ED \else /y ED \fi } ifelse + cleartomark + \ifx\psk@Derive\@NOTEMPTY%%begin dr 0606 + %% algebraic we can use the derivative machine + /FDer@pstplot (#4) @parametric { (t) } { (x) } ifelse + tx@Derive begin Derive end tx@addDict begin AlgParser end cvx def + \fi%%end dr 0606 + x \pst@number\psxunit mul y \pst@number\psyunit mul + translate % define the temporary origin + % now we calculate the slope of the tangent + \ifx\psk@Derive\@empty% de we have a derivation defined? + #2 abs 1.0e-6 lt % no, we choose secant for the tangent + { #2 0.0005 add dup /x ED /t ED tx@addDict begin mark F@pstplot end counttomark 1 gt % test, if we have parametricplot + { /y2 ED /x2 ED } % we have 2 values + { \ifPst@polarplot dup x \ifPst@algebraic RadtoDeg \fi + cos mul /x2 ED x \ifPst@algebraic RadtoDeg \fi sin mul \else /x2 x def \fi /y2 ED } ifelse + cleartomark % delete the mark + #2 0.0005 sub dup /x ED /t ED tx@addDict begin mark F@pstplot end counttomark 1 gt % test, if we have parametricplot + { /y1 ED /x1 ED } + { \ifPst@polarplot dup x \ifPst@algebraic RadtoDeg \fi + cos mul /x1 ED x \ifPst@algebraic RadtoDeg \fi sin mul \else /x1 x def \fi /y1 ED } ifelse + cleartomark + y2 y1 sub x2 x1 sub } % dy dx + { % > 1.0e-06 + #2 1.0005 mul dup /x ED /t ED tx@addDict begin mark F@pstplot end counttomark 1 gt % test, if we have parametricplot + { /y2 ED /x2 ED } % we have 2 values + { \ifPst@polarplot dup x \ifPst@algebraic RadtoDeg \fi + cos mul /x2 ED x \ifPst@algebraic RadtoDeg \fi sin mul \else /x2 x def \fi /y2 ED } ifelse + cleartomark + #2 .9995 mul dup /x ED /t ED tx@addDict begin mark F@pstplot end counttomark 1 gt % test, if we have parametricplot + { /y1 ED /x1 ED } % we have 2 values + { \ifPst@polarplot dup x \ifPst@algebraic RadtoDeg \fi + cos mul /x1 ED x \ifPst@algebraic RadtoDeg \fi sin mul \else /x1 x def \fi /y1 ED } ifelse + cleartomark + y2 y1 sub \pst@number\psyunit mul x2 x1 sub \pst@number\psxunit mul } ifelse + atan % atan(dy dx), we have the slope angle of the secant + \ifPST@Tnormal 90 add \fi + \else % there is a derivation defined + #2 dup /x ED /t ED tx@addDict begin mark FDer@pstplot end counttomark 1 gt % test, if we have parametricplot + { /y ED /x ED } + { \ifPst@polarplot /Fphi ED % the value F'(phi) + tx@addDict begin F@pstplot end x \ifPst@algebraic RadtoDeg \fi PtoC /y0 ED /x0 ED % the x y values + x \ifPst@algebraic RadtoDeg \fi sin Fphi mul x0 add /y ED + x \ifPst@algebraic RadtoDeg \fi cos Fphi mul y0 sub /x ED + \else /y ED /x 1 def \fi } ifelse + cleartomark + y \pst@number\psyunit mul x \pst@number\psxunit mul Atan \ifPST@Tnormal 90 add \fi + % y ATAN1 % we have the slope angle of the tangent. ATAN is defined int the pstricks.pro, patch 6 + \fi + cvi 180 mod dup 90 gt { 180 sub } if % -90 <= angle <= 90 + rotate % rotate, depending to the origin + /Lineto /lineto load def % the pro file needs /Lineto + \pst@cp % kill the currentpoint, if any + [ % start array of points + \ifPST@Tnormal + 0 0 % moveto + #3 + y \pst@number\psyunit mul x \pst@number\psxunit mul Atan cos div \pst@number\psxunit mul 0 % lineto + \else % points are in reverse order ... + \ifx\pst@tempRight\@empty #3 \else \pst@tempRight\space \fi \pst@number\psxunit mul 0 % moveto + \if@star 0 + \else + \ifx\pst@tempRight\@empty #3 neg \else \pst@tempLeft\space \fi + \pst@number\psxunit mul + \fi 0 % lineto + \fi + \pst@usecolor\pslinecolor + false % don't show the points + \tx@Line + \ifx\pslinestyle\@none\else + \pst@number\pslinewidth SLW + \tx@setStrokeTransparency + \@nameuse{psls@\pslinestyle} + \fi + \ifshowpoints % show the points? + gsave + \psk@dotsize + \@nameuse{psds@\psk@dotstyle} + 0 0 Dot + grestore + \fi + }% + \use@pscode + \endgroup% + \@starfalse% + \ignorespaces} +% +%% #1-#2 x range +%% #3 initial value of y (which is a vector) y(0) y'(0) y''(0) ... +%% #4 value of the derivative (y and t can be used) +% +\define@boolkey[psset]{pstricks-add}[Pst@]{GetFinalState}[true]{} +\define@key[psset]{pstricks-add}{filename}{\def\psk@filename{#1}}% +\define@boolkey[psset]{pstricks-add}[Pst@]{saveData}[true]{} % \ifPst@saveData +\psset[pstricks-add]{GetFinalState=false,saveData=false,filename=PSTdata} +% +\def\Begin@SaveFinalState{ end + /PST@beginspecial /@beginspecial load def + /PST@endspecial /@endspecial load def + /PST@setspecial /@setspecial load def + /@beginspecial {} def /@endspecial{} def /@setspecial {} def + tx@Dict begin +} +\newif\ifPst@BeginSaveFinalState \Pst@BeginSaveFinalStatefalse +\def\BeginSaveFinalState{\Pst@BeginSaveFinalStatetrue} +\def\End@SaveFinalState{ + /@beginspecial /PST@beginspecial load def + /@endspecial /PST@endspecial load def + /@setspecial /PST@setspecial load def +} +\def\EndSaveFinalState{\pstverb{\End@SaveFinalState}} + +\def\psplotDiffEqn{\def\pst@par{}\pst@object{psplotDiffEqn}}% initial code by Dominique 2005-05-21 +\def\psplotDiffEqn@i#1#2#3#4{% + \addbefore@par{xStart=#1}% + \pst@killglue% + \begingroup% + \use@par% + \@nameuse{beginplot@\psplotstyle}% + \addto@pscode{% + \ifPst@BeginSaveFinalState \Begin@SaveFinalState \fi + \ifPst@saveData /Pst@data (\psk@filename) (w) file def \fi + /x #1 def % first value + /x1 #2 def % last value + \ifPst@GetFinalState \Begin@SaveFinalState /y SaveFinalState def + \else /y [ #3 ] def \fi % values for t=0 + /ylength y length def % number of elements in #3 + /addvect { + 1 1 ylength { + /i exch def + ylength i sub 2 add -1 roll add ylength 2 mul i sub 1 roll + } for + } def + /dx x1 x sub \psk@plotpoints\space div def + /mulvect { + ylength exch + 1 index { + dup 4 -1 roll mul 2 index 2 add 1 roll + } repeat + pop pop } def + /divvect { ylength exch 1 index { dup 4 -1 roll exch div 2 index 2 add 1 roll } repeat pop pop } def + /k0 0 def /k1 0 def /k2 0 def /k3 0 def + \ifPst@algebraic /F@pstplot (#4) tx@addDict begin AlgParser end cvx def \fi + /Func { + \ifPst@algebraic F@pstplot ylength array astore + \else + \ifPst@buildvector\else y aload pop \fi #4 + \ifPst@buildvector\else ylength array astore \fi + \fi + } def + \ifx\psk@method\@adams /F1 0 def /F2 0 def /F3 0 def /F4 0 def /F5 0 def /F6 0 def /INIT 1 def \fi + \ifx\psk@method\@empty\else + \ifx\psk@method\@varrkiv %% RUNGE-KUTTA method with var step algorithm + /VarStep false def /VarStepRatio 1 def + /RK { + /k0 Func { dx mul } forall ylength array astore def %% y + dup aload pop k0 { 2 div } forall addvect ylength array astore /y exch def % + x dup dx 2 div add /x exch def %% y x + /k1 Func { dx mul } forall ylength array astore def %% y x + exch dup aload pop k1 { 2 div } forall addvect y astore pop %% x y + /k2 Func { dx mul } forall ylength array astore def %% x y + dup aload pop k2 aload pop addvect y astore pop exch dup dx add /x exch def %% y x + /k3 Func { dx mul } forall ylength array astore def %% y x + /x exch def %% y + dup aload pop k0 aload pop k1 aload pop k2 aload pop addvect + 2 mulvect addvect k3 aload pop addvect + 6 divvect addvect y astore + } def + /VARRK { + VarStep + %{ /dx dx \psk@varstepincrease\space mul def /VarStep false def } if + { /dx dx VarStepRatio mul def /VarStep false def } if + x dx add x1 gt { /dx x1 x sub def } if + %{ /dx dx \psk@varstepdecrease\space div def } ifelse + %% we compute y(x+dx) from y(x) using RK4 + RK %% y(x) y(x+dx) + exch /y exch def /dx dx 2 div def + { %% we compute y(x+dx/2) from y(x) using RK4 + y RK %% y(x+dx) y(x+dx/2) + %% then y(x+dx) from y(x+dx/2) using RK4 + /y exch def y RK %% y(x+dx) y(x) y(x+dx/2) y(x+dx) + dup aload pop 4 ylength add -1 roll + { -1 mul } forall addvect 0 ylength { exch abs 2 copy lt { exch } if pop } repeat + 0 3 -1 roll {abs 2 copy lt { exch } if pop } forall + dup 1e-6 lt { pop } { div } ifelse + /dx dx 2 mul def + dup \psk@varsteptol\space lt + %{ \psk@varsteptol\space div .1 lt { /VarStep true def } if pop exit } if + %pop /dx dx 4 div def exch /y exch def } loop + { .001 div dup .1 lt + { dup 1e-6 lt { pop 3 } { log neg } ifelse /VarStepRatio exch def /VarStep true def } + { pop } ifelse pop exit } if + pop /dx dx 4 div def exch /y exch def } loop + } def + \else %% RUNGE-KUTTA & ADAMS methods + /RK { + /k0 Func { dx mul } forall ylength array astore def %% y + dup aload pop k0 { 2 div } forall addvect ylength array astore /y exch def % + x dup dx 2 div add /x exch def %% y x + /k1 Func { dx mul } forall ylength array astore def %% y x + exch dup aload pop k1 { 2 div } forall addvect y astore pop %% x y + /k2 Func { dx mul } forall ylength array astore def %% x y + dup aload pop k2 aload pop addvect y astore pop exch dup dx add /x exch def %% y x + /k3 Func { dx mul } forall ylength array astore def %% y x + /x exch def %% y + dup aload pop k0 aload pop k1 aload pop k2 aload pop addvect + 2 mulvect addvect k3 aload pop addvect + 6 divvect addvect y astore pop + } def + \ifx\psk@method\@adams + /ADAMS { + \ifcase\psk@adamsorder + \errmessage{pstricks-add error: no order 0th for adams method (see user's manual)} + \or\errmessage{pstricks-add error: no order 1st for adams method (see user's manual)} + \or\errmessage{pstricks-add error: no order 2nd for adams method (see user's manual)} + \or\errmessage{pstricks-add error: no order 3rd for adams method (see user's manual)} + \or + %% ORDRE 4 + F4 aload pop 55 mulvect + F3 aload pop -59 mulvect addvect + F2 aload pop 37 mulvect addvect + F1 aload pop -9 mulvect addvect + dx mulvect 24 divvect + \or + %% ORDRE 5 + F5 aload pop 1901 mulvect + F4 aload pop -2774 mulvect addvect + F3 aload pop 2616 mulvect addvect + F2 aload pop -1274 mulvect addvect + F1 aload pop 251 mulvect addvect + dx mulvect 720 divvect + \or + %% ORDRE 6 + F6 aload pop 4277 mulvect + F5 aload pop -7923 mulvect addvect + F4 aload pop 9982 mulvect addvect + F3 aload pop -7298 mulvect addvect + F2 aload pop 2877 mulvect addvect + F1 aload pop -475 mulvect addvect + dx mulvect 1440 divvect + \fi + y aload pop addvect ylength array astore /y exch def } def + \fi + \fi + \fi + /xy { + \ifx\psk@plotfuncx\@empty + \ifx\psk@whichabs\@empty x \else y \psk@whichabs\space get \fi + \else \psk@plotfuncx\space \fi + \pst@number\psxunit mul y + \ifx\psk@method\@empty %% EULER method + /y Func { dx mul } forall y aload pop addvect ylength array astore def + \else% + \ifx\psk@method\@varrkiv %% RUNGE-KUTTA method + VARRK + \else\ifx\psk@method\@rkiv %% RUNGE-KUTTA method + RK + \else + /F1 F2 def /F2 F3 def /F3 F4 def /F4 %% ADAMS method + \ifcase\psk@adamsorder\or\or\or\or + %% ORDRE 4 + Func def + \or + %% ORDRE 5 + F5 def /F5 Func def + \or + %% ORDRE 6 + F5 def /F5 F6 def /F6 Func def + \fi + INIT \psk@adamsorder\space lt + { RK /INIT INIT 1 add def } + { ADAMS } ifelse + \fi\fi + \fi + \ifx\psk@plotfuncy\@empty + \ifx\psk@whichord\@empty 0 \else \psk@whichord\space \fi get % + \else \psk@plotfuncy\space \fi + \pst@number\psyunit mul +% Pst@data (\string\[) writestring + \ifPst@saveData + 2 copy + \pst@number\psyunit div exch \pst@number\psxunit div + 20 string cvs Pst@data exch writestring + Pst@data (\space) writestring + 20 string cvs Pst@data exch writestring + Pst@data (\string\n) writestring + \fi + } def + }% + \gdef\psplot@init{}% + \@pstfalse + \@nameuse{testqp@\psplotstyle}% + \if@pst\psplot@ii\else\psplot@iii\fi +% \addto@pscode{\ifPst@saveData Pst@data closefile \fi} + \endgroup% + \ignorespaces% +} +% +% +\def\psGTriangle{\def\pst@par{}\pst@object{psGTriangle}} +\def\psGTriangle@i(#1)(#2)(#3)#4#5#6{{% + \def\solid@star{}% + \begin@ClosedObj + \pst@getcoor{#1}\pst@tempA % A: "rgb xr xg xb" or "gray xg" + \pst@getcoor{#2}\pst@tempB % B + \pst@getcoor{#3}\pst@tempC % C + \pst@getcolor{#4}\pst@colorA + \pst@getcolor{#5}\pst@colorB + \pst@getcolor{#6}\pst@colorC + \addto@pscode{% + \pst@tempC % C + \pst@tempB % B + \psk@gangle % rotating angle + \pst@tempA % A, temporary origin + /rgb {} def + /gray {} def + [ \pst@colorC ] aload length 1 eq { dup dup } if 3 array astore % gray -> rgb + [ \pst@colorB ] aload length 1 eq { dup dup } if 3 array astore + [ \pst@colorA ] aload length 1 eq { dup dup } if 3 array astore + tx@addDict begin GTriangle end % PS part + }% + \if@star\pspolygon[fillstyle=none](#1)(#2)(#3)\fi% draw borderline + \def\pst@linetype{2}% + \end@ClosedObj% +}\ignorespaces} +% +\def\psdice{\def\pst@par{}\pst@object{psdice}} +\def\psdice@i#1{{% + \pst@killglue% + \addbefore@par{framearc=0.3,linewidth=1pt}% + \use@par% + \psframe(-0.5,-0.5)(0.5,0.5)% + \ifodd#1 \qdisk(0,0){0.1\psunit}\else\qdisk(-0.3,-0.3){0.1\psunit}\qdisk(0.3,0.3){0.1\psunit}\fi + \ifcase#1% + \or\or\or\qdisk(-0.3,-0.3){0.1\psunit}\qdisk(0.3,0.3){0.1\psunit}% 3 + \or\qdisk(-0.3,0.3){0.1\psunit}\qdisk(0.3,-0.3){0.1\psunit}% 4 + \or\qdisk(-0.3,-0.3){0.1\psunit}\qdisk(0.3,0.3){0.1\psunit}% 5 + \qdisk(-0.3,0.3){0.1\psunit}\qdisk(0.3,-0.3){0.1\psunit} + \or\qdisk(-0.3,0.3){0.1\psunit}\qdisk(0.3,-0.3){0.1\psunit}% 6 + \qdisk(-0.3,0){0.1\psunit}\qdisk(0.3,0){0.1\psunit}% + \fi% + \ignorespaces% +}} +% +% the datafile must be a matrix with +% /dotmatrix [ +% ..... +% ..... +% ] def +% +\def\pswavelengthToGRAY{ tx@addDict begin wavelengthToGRAY end } +\def\pswavelengthToRGB{ tx@addDict begin wavelengthToRGB Red Green Blue end } +% +\define@key[psset]{pstricks-add}{Xoffset}[0pt]{\pst@getlength{#1}\psk@Xoffset} +\define@key[psset]{pstricks-add}{Yoffset}[0pt]{\pst@getlength{#1}\psk@Yoffset} +\define@key[psset]{pstricks-add}{XYoffset}[0pt]{\pst@getlength{#1}\psk@Xoffset\let\psk@Yoffset\psk@Xoffset} +\psset[pstricks-add]{XYoffset=0pt} +\define@key[psset]{pstricks-add}{colorType}[0]{\def\psk@colorType{#1}} +\define@key[psset]{pstricks-add}{colorTypeDef}[{}]{\def\psk@colorTypeDef{#1\space}} +\psset[pstricks-add]{colorType=0,colorTypeDef={}} % 0-> two color mode 1->wavelength mode (400..700nm) +% 0-> two color mode +% 1-> wavelength mode (400..700nm) +% 2-> wavelength mode inverse +% 3-> gray color mode +% 4-> gray color mode invers +% 5-> own color definition +\def\psMatrixPlot{\def\pst@par{}\pst@object{psMatrixPlot}} +\def\psMatrixPlot@i#1#2#3{% + \pst@killglue% + \addbefore@par{xStep=1,yStep=1}% + \begin@SpecialObj% + \addto@pscode{ + (#3) run % load the data file + /Min 0 def /Max 0 def + dotmatrix { dup Min lt { /Min ED } { dup Max gt { /Max ED } { pop } ifelse } ifelse } forall + /dMaxMin Max Min sub def + \psk@dotsize + \psk@Xoffset\space \psk@Yoffset\space translate + \@nameuse{psds@\psk@dotstyle} % + /n 0 def % index for element + 1 1 #1 { % the y loop (outer one) + /y exch def % save y + 1 1 #2 { % the x loop (inner one) + /x exch def % save x + dotmatrix n get % get value from matrix + \ifcase\psk@colorType + dup 0 gt { % test if > 0 + \or + Min sub dMaxMin div 300 mul 400 add + \pswavelengthToRGB setrgbcolor + \or + Min sub dMaxMin div neg 1 add 300 mul 400 add + \pswavelengthToRGB setrgbcolor + \or + Min sub dMaxMin div neg 1 add 300 mul 400 add + \pswavelengthToGRAY setgray + \or + Min sub dMaxMin div neg 1 add 300 mul 400 add + \pswavelengthToGRAY neg 1 add setgray + \or + currentdict /colorTypeDef known { colorTypeDef } { \psk@colorTypeDef } ifelse + \fi + x \psk@xStep\space mul \pst@number\psxunit mul + \ifPst@ChangeOrder #1 y sub 1 add \else y \fi \psk@yStep\space mul \pst@number\psyunit mul Dot% + \ifcase\psk@colorType + } { pop } ifelse + \fi + /n n 1 add def + } for + } for + }% + \end@SpecialObj% + \ignorespaces% +} +% +\newdimen\chart@ColorIndex +\newdimen\chart@ColorStep +\newdimen\pst@chartHeight +\newdimen\pst@chartStackDepth +\newdimen\pst@chartStackWidth +\newcount\chart@Toggle +\newif\if@chartSep +\newif\if@chartUserColor +% +\define@key[psset]{pstricks-add}{chartStyle}{\def\psk@chartStyle{#1}} +\psset[pstricks-add]{chartStyle=pie}% p)ie P)ie-3d-view h)istogram H)istogram-3dview +% +\define@key[psset]{pstricks-add}{chartColor}{\pst@expandafter\psk@@chartColor{#1}\@nil} +\def\psk@@chartColor#1#2\@nil{% + \ifx#1r\def\psk@chartColor{2}\else% + \ifx#1c\def\psk@chartColor{380}\else\def\psk@chartColor{0}\fi\fi} +\psset[pstricks-add]{chartColor=gray}% gray, color, randomColor +% +\define@key[psset]{pstricks-add}{chartSep}{\pst@getlength{#1}\psk@chartSep} +\define@key[psset]{pstricks-add}{chartStack}{\pst@getint{#1}\psk@chartStack} +\define@key[psset]{pstricks-add}{chartStackDepth}{\pssetylength\pst@chartStackDepth{#1}} +\define@key[psset]{pstricks-add}{chartStackWidth}{\pssetxlength\pst@chartStackWidth{#1}} +\define@key[psset]{pstricks-add}{chartHeight}{\pssetylength\pst@chartHeight{#1}} +\psset[pstricks-add]{chartSep=10pt,chartStack=0,chartStackDepth=2cm,chartStackWidth=2cm,% + chartHeight=5mm} +% +\define@key[psset]{pstricks-add}{userColor}{% + \chart@Toggle=0\relax% + \def\chart@option{#1}% + \ifx\chart@option\@empty\@chartUserColorfalse% + \else% + \@chartUserColortrue% + \expandafter\psk@@chartUserColor#1,,\@nil% + \fi} +\def\psk@@chartUserColor#1,#2,#3\@nil{% + \advance\chart@Toggle by \@ne% + \xglobal\colorlet{chartFillColor\the\chart@Toggle}{#1}% + \def\chart@option{#2}% + \ifx\chart@option\@empty\else\psk@@chartUserColor#2,#3,\@nil\fi}% +\psset[pstricks-add]{userColor={}} + +\define@key[psset]{pstricks-add}{chartNodeI}{\def\psk@chartNodeI{#1}} +\define@key[psset]{pstricks-add}{chartNodeO}{\def\psk@chartNodeO{#1}} +\psset[pstricks-add]{chartNodeI=0.75,chartNodeO=1.5} +% +\def\psChart{\pst@object{psChart}} +\def\psChart@i#1#2#3{% +% #1:values #2:separated charts +% #3 radius->pie; max height->histogram + \pst@killglue% + \global\pssetylength\pst@chartHeight{#3}% + \global\let\pst@chartRadius\pst@chartHeight% + \begingroup% + \def\psk@chartValues{#1}% + \def\psk@chartSepValues{#2}% only valid for a pie chart + \pst@dimm=\z@% sum of all entries (for a pie) + \pst@cnta=1\relax% number of entries + \pst@dimn=\z@% greatest entry + \psforeach{\chart@tempA}{#1}{% + \global\advance\pst@cnta by \@ne% % no of entries + \global\advance\pst@dimm by \chart@tempA\p@% % sum of all entries + \pst@dima=\chart@tempA\p@% + \ifdim\pst@dima>\pst@dimn\global\pst@dimn=\pst@dima\fi% + }% + \addbefore@par{dimen=outer}% + \begin@SpecialObj% + \ifnum\psk@chartColor>0\relax% + \chart@ColorStep=400\p@\else\chart@ColorStep=\p@\fi % the "numerical color" + \divide\chart@ColorStep by \pst@cnta% % step =1/no or 400/no + \chart@ColorIndex=\psk@chartColor\p@% % the start color (gray or wave) + \@nameuse{pscs@\psk@chartStyle}% + \end@SpecialObj% + \endgroup% + \ignorespaces% +} +% +\def\pscs@pie{% + \degrees[\pst@number\pst@dimm]% % instead of 360 degrees + \def\chart@alpha{0}% + \pst@dimm=\z@\pst@dimn=\z@\pst@dimo=\z@\pst@cnta=0\relax% + \global\chart@Toggle=1\relax% + \ifpsshadow% create shadow first + \psforeach{\chart@tempA}{\psk@chartValues}{% + \global\advance\pst@dimm by \chart@tempA\p@% + \global\advance\pst@dimn by \chart@alpha\p@% + \global\advance\pst@cnta by \@ne% + \pst@dimo=0.5\pst@dimn\advance\pst@dimo by 0.5\pst@dimm% half angle of the chart + \global\@chartSepfalse% + \if$\psk@chartSepValues$\else% + \psforeach{\chart@tempC}{\psk@chartSepValues}{\ifnum\chart@tempC=\the\pst@cnta\relax\global\@chartSeptrue\fi}% + \fi% + \if@chartSep% + \pswedge(\psk@chartSep\p@;\pst@number\pst@dimo){\pst@chartRadius}{\pst@number\pst@dimn}{\pst@number\pst@dimm}% + \else% + \pswedge(0,0){\pst@chartRadius}{\pst@number\pst@dimn}{\pst@number\pst@dimm}% + \fi% + \global\let\chart@alpha\chart@tempA% + }% + \psshadowfalse% + \fi% + \def\chart@alpha{0}% + \pst@dimm=0pt\pst@dimn=0pt\pst@dimo=0pt\pst@cnta=0\relax% + \psForeach{\chart@tempA}{\psk@chartValues}{% + \global\advance\pst@dimm by \chart@tempA\p@% + \global\advance\pst@dimn by \chart@alpha\p@% + \def\pst@tempB{\pst@number\chart@ColorIndex}% +% \psDEBUG[psChart:wave:color]{\pst@tempB}% + \global\advance\pst@cnta by \@ne% + \if@chartUserColor\else% + \def\chart@FillColor{chartFillColor\the\pst@cnta}% + \ifnum\psk@chartColor>0\relax% + \xglobal\definecolor{\chart@FillColor}{wave}{\pst@tempB}% + \else\xglobal\definecolor{\chart@FillColor}{gray}{\pst@tempB}\fi% + \fi% + \pst@dimo=0.5\pst@dimn\advance\pst@dimo by 0.5\pst@dimm% half angle of the chart + \global\@chartSepfalse% + \if$\psk@chartSepValues$\else% + \psForeach{\chart@tempC}{\psk@chartSepValues}{\ifnum\chart@tempC=\the\pst@cnta\relax\global\@chartSeptrue\fi}% + \fi% + \if@chartSep% + \pswedge[linecolor={chartFillColor\the\pst@cnta},fillstyle=solid,fillcolor={chartFillColor\the\pst@cnta}]% + (\psk@chartSep\p@;\pst@number\pst@dimo){\pst@chartRadius}{\pst@number\pst@dimn}{\pst@number\pst@dimm}% + \pst@dima=\pst@chartRadius\advance\pst@dima by \psk@chartSep\p@% + \pnode(\pst@dima;\pst@number\pst@dimo){psChart\the\pst@cnta}% + \pst@dimb=\psk@chartNodeI\pst@dima% + \pst@dimc=\psk@chartNodeO\pst@dima% + \pnode(\pst@dimb;\pst@number\pst@dimo){psChartI\the\pst@cnta}% + \pnode(\pst@dimc;\pst@number\pst@dimo){psChartO\the\pst@cnta}% + \else% + \pswedge[linecolor={chartFillColor\the\pst@cnta},fillstyle=solid,fillcolor={chartFillColor\the\pst@cnta}](0,0)% + {\pst@chartRadius}{\pst@number\pst@dimn}{\pst@number\pst@dimm}% + \pnode(\pst@chartRadius;\pst@number\pst@dimo){psChart\the\pst@cnta}% + \pst@dima=\pst@chartRadius% + \pst@dimb=\psk@chartNodeI\pst@dima% + \pst@dimc=\psk@chartNodeO\pst@dima% + \pnode(\pst@dimb;\pst@number\pst@dimo){psChartI\the\pst@cnta}% + \pnode(\pst@dimc;\pst@number\pst@dimo){psChartO\the\pst@cnta}% + \fi% + \global\let\chart@alpha\chart@tempA% + \global\advance\chart@Toggle by \@ne% + \ifnum\chart@Toggle<3\relax% + \global\advance\chart@ColorIndex by 2\chart@ColorStep% + \else% + \global\chart@Toggle=0% + \global\advance\chart@ColorIndex by -\chart@ColorStep% + \fi% + }% end foreach + \ignorespaces% +} +% +\def\pscs@histogram{% + \def\chart@maxValue{\pst@number\pst@dimn}% max of the data + \pst@@divide\pst@dimn\pst@chartHeight% maxValue/maxHeight + \psDEBUG[pscs@histogram]{chart@maxValue=\chart@maxValue} + \psDEBUG[pscs@histogram]{(maxValue/maxHeight)pst@dimg=\pst@number\pst@dimg} + \psDEBUG[pscs@histogram]{pst@chartHeight=\the\pst@chartHeight} + \pst@dimo=28.46\pst@dimg + \edef\pst@chartUnit{\pst@number\pst@dimo} +% \psaxes[axesstyle=frame, +% dy=1cm,Dy=\pst@number\pst@dimo](\the\pst@cnta,\the\pst@chartHeight) + \pst@dimm=0pt\pst@dimn=0pt\pst@dimo=0pt\pst@cnta=0% + \global\chart@Toggle=1 + \psforeach{\chart@tempA}{\psk@chartValues}{% + \global\advance\pst@dimm by \chart@tempA pt% + \def\pst@tempB{\pst@number\chart@ColorIndex}% + \psDEBUG[psChart:wave:color]{\pst@tempB}% + \global\advance\pst@cnta by \@ne% + \if@chartUserColor\else + \def\chart@FillColor{chartFillColor\the\pst@cnta} + \ifnum\psk@chartColor>0 \xglobal\definecolor{\chart@FillColor}{wave}{\pst@tempB}% + \else\xglobal\definecolor{\chart@FillColor}{gray}{\pst@tempB}\fi% + \fi + \psframe[linecolor={chartFillColor\the\pst@cnta},fillstyle=solid,fillcolor={chartFillColor\the\pst@cnta}]% + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div sub 0) + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div add \chart@tempA\space \pst@chartUnit\space div) + \pnode(!\the\pst@cnta\space 0){psChart\the\pst@cnta}% + \pnode(!\the\pst@cnta\space \chart@tempA\space 2 div \pst@chartUnit\space div){psChartM\the\pst@cnta}% + \pnode(!\the\pst@cnta\space \chart@tempA\space \pst@chartUnit\space div){psChartT\the\pst@cnta}% + \global\advance\chart@Toggle by \@ne + \ifnum\chart@Toggle<3 + \global\advance\chart@ColorIndex by 2\chart@ColorStep + \else + \global\chart@Toggle=0 + \global\advance\chart@ColorIndex by -\chart@ColorStep% + \fi% + }% end foreach +} +% +\def\pst@stackList{} +\def\addbefore@stackList#1{% + \ifx\pst@stackList\@empty + \xdef\pst@stackList{#1}% + \else + \toks@{#1}% + \pst@toks\expandafter{\pst@stackList}% + \xdef\pst@stackList{\the\toks@,\the\pst@toks}% + \fi% +} +% +\def\pscs@Histogram{% + \psDEBUG[pscs@Histogram]{psk@chartStack=\psk@chartStack}% + \def\chart@maxValue{\pst@number\pst@dimn}% max of the data + \pst@@divide\pst@dimn\pst@chartHeight% maxValue/maxHeight + \psDEBUG[pscs@Histogram]{chart@maxValue=\chart@maxValue}% + \psDEBUG[pscs@Histogram]{(maxValue/maxHeight)pst@dimg=\pst@number\pst@dimg}% + \psDEBUG[pscs@Histogram]{pst@chartHeight=\the\pst@chartHeight}% + \pst@dimo=28.46\pst@dimg% + \edef\pst@chartUnit{\pst@number\pst@dimo}% +% \psaxes[axesstyle=frame, +% dy=1cm,Dy=\pst@number\pst@dimo](\the\pst@cnta,\the\pst@chartHeight) + \pst@dimm=0pt\pst@dimn=0pt\pst@dimo=0pt\pst@cnta=0% + \global\chart@Toggle=1 % for color toggling + \pst@cntn=0 % stacked step + \pst@cnto=0 % for a stacked view + \pst@cntp=\psk@chartStack % for a stacked view + \def\pst@stackList{} + \psDEBUG[pscs@Histogram]{psk@chartStack=\the\pst@cntp}% + \psforeach{\chart@tempA}{\psk@chartValues}{% the loop + \ifnum\pst@cntp>0 % stacked version? + \advance\pst@cnto by \@ne % increase + \psDEBUG[pscs@Histogram]{chart@tempA=\chart@tempA}% + \expandafter\addbefore@stackList\expandafter{\chart@tempA}% + \psDEBUG[pscs@Histogram]{stack list=\pst@stackList}% + \ifnum\pst@cnto=\pst@cntp % draw? + \pst@cnto=\psk@chartStack\advance\pst@cnto by \m@ne + \psforeach{\chart@tempB}{\pst@stackList}{% the stack loop + \global\pst@cnta=\pst@cntn % we do not need the value + \psDEBUG[pscs@Histogram]{pst@cnto=\the\pst@cnto}% + \psDEBUG[pscs@Histogram]{pst@chartStackDepth=\the\pst@chartStackDepth}% + \psDEBUG[pscs@Histogram]{pst@chartStackWidth=\the\pst@chartStackWidth}% + \edef\pst@tempA{\the\pst@cnto}% + \psDEBUG[pscs@Histogram]{pst@tempA=\pst@tempA}% + \ifnum\pst@cnto>0 + \pst@dima=\pst@chartStackDepth% + \pst@dimb=\pst@chartStackWidth% + \divide \pst@dima by \pst@tempA% + \divide \pst@dimb by \pst@tempA% + \else\pst@dima=\z@ \pst@dimb=\z@% + \fi% + \rput(\the\pst@dima, \the\pst@dimb){\pscs@Histogram@i{\chart@tempB}} + \advance\pst@cnto by \m@ne % decrease stack counter + }% + \advance\pst@cntn by \tw@ % increase + \def\pst@stackList{}% reset stack list + \pst@cnto=0 % reset stack counter + \fi% + \else% + \pscs@Histogram@i{\chart@tempA}% non stacked version + \fi% + }% end foreach +} +% +\def\pscs@Histogram@i#1{% draw the 3d-like bar + \def\pst@tempB{\pst@number\chart@ColorIndex}% + \global\advance\pst@cnta by \@ne% + \if@chartUserColor\else + \def\chart@FillColor{chartFillColor\the\pst@cnta} + \ifnum\psk@chartColor>0 \xglobal\definecolor{\chart@FillColor}{wave}{\pst@tempB}% + \else\xglobal\definecolor{\chart@FillColor}{gray}{\pst@tempB}\fi% + \fi + \pspolygon[fillstyle=solid,fillcolor={chartFillColor\the\pst@cnta}]% + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div sub 0)% ll + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div add 0)% lr + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div 1.5 mul add \psk@chartSep\space 56.92 div)% 'lr + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div 1.5 mul add + \psk@chartSep\space 56.92 div #1 \pst@chartUnit\space div add )% 'ur + (!\the\pst@cnta\space \psk@chartSep\space 56.92 div sub + \psk@chartSep\space 56.92 div #1 \pst@chartUnit\space div add )% 'ul + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div sub #1 \pst@chartUnit\space div)%ul + \psline% + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div add 0)% lr + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div add #1 \pst@chartUnit\space div) + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div sub #1 \pst@chartUnit\space div)%ul + \psline% + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div add #1 \pst@chartUnit\space div) + (!\the\pst@cnta\space \psk@chartSep\space 28.46 div 1.5 mul add + \psk@chartSep\space 56.92 div #1 \pst@chartUnit\space div add )% 'ur + \pnode(!\the\pst@cnta\space 0){psChart\the\pst@cnta}% + \pnode(!\the\pst@cnta\space #1 2 div \pst@chartUnit\space div){psChartM\the\pst@cnta}% + \pnode(!\the\pst@cnta\space #1 \pst@chartUnit\space div){psChartT\the\pst@cnta}% + \global\advance\chart@Toggle by \@ne + \ifnum\chart@Toggle<3 + \global\advance\chart@ColorIndex by 2\chart@ColorStep + \else + \global\chart@Toggle=0 + \global\advance\chart@ColorIndex by -\chart@ColorStep% + \fi% + \global\advance\chart@ColorIndex by 1pt +} +% +\define@key[psset]{pstricks-add}{cancelType}{\pst@expandafter\psk@@cancelType{#1xx}\@nil} +\def\psk@@cancelType#1#2\@nil{% + \ifx\relax#1\relax\def\psk@cancelType{2}\else% x + \ifx#1b\def\psk@cancelType{2}\else% \ + \ifx#1s\def\psk@cancelType{1}\else% / + \def\psk@cancelType{0}\fi\fi\fi}% x every other + +\psset[pstricks-add]{cancelType=}% x, crossing +\def\psCancel{\def\pst@par{}\pst@object{psCancel}}% by Stefano Baroni 2008-06-21 +\def\psCancel@i{\pst@makebox\psCancel@iii} +\def\psCancel@iii{% + \begingroup + \solid@star + \use@par + \pst@dima=\pslinewidth + \advance\pst@dima by \psframesep + \pst@dimc=\wd\pst@hbox\advance\pst@dimc by \pst@dima + \pst@dimb=\dp\pst@hbox\advance\pst@dimb by \pst@dima + \pst@dimd=\ht\pst@hbox\advance\pst@dimd by \pst@dima + \setbox\pst@hbox=\hbox{% + \ifpsboxsep\kern\pst@dima\fi + \begin@ClosedObj + \addto@pscode{ + \psk@cornersize % arcradius boolean + \pst@number\pst@dima neg + \pst@number\pst@dimb neg + \pst@number\pst@dimc + \pst@number\pst@dimd + .5 + \if@star \tx@Frame \else + CLW mul /a ED % the middle of the line + 3 -1 roll 2 copy gt { exch } if + a sub /y2 ED + a add /y1 ED + 2 copy gt { exch } if + a sub /x2 ED + a add /x1 ED + pop pop % delete arc values + \ifnum\psk@cancelType<\tw@ % / or x + x1 y1 moveto + x2 y2 lineto + \fi% + \ifnum\psk@cancelType=\@ne\else % \ or x + x2 y1 moveto + x1 y2 lineto + \fi + \fi + }% + \def\pst@linetype{2}% + \showpointsfalse + \end@ClosedObj + \box\pst@hbox + \ifpsboxsep\kern\pst@dima\fi% + }% + \ifpsboxsep\dp\pst@hbox=\pst@dimb\ht\pst@hbox=\pst@dimd\fi + \leavevmode\box\pst@hbox + \endgroup% +} +% +\newcount\psVectorCtr +\define@boolkey[psset]{pstricks-add}[Pst@]{markAngle}[true]{} +\psset[pstricks-add]{markAngle=false} +% +\newpsstyle{psMarkAngleStyle}{arrows=->,arrowsize=4pt} +\newpsstyle{psMarkAngleLineStyle}{linestyle=dotted,arrows=-} +% +\def\psStartPoint{\@ifnextchar[{\psStartPoint@i}{\psStartPoint@i[Vector]}} +\def\psStartPoint@i[#1](#2){% + \global\psVectorCtr=\@ne + \gdef\psVectorName{#1} + \pnode(#2){#10} + \pst@getcoor{#2}\pst@tempA% + \pstVerb{tx@Dict begin + \pst@tempA + \pst@number\psyunit div /cp.Y exch def + \pst@number\psxunit div /cp.X exch def end }} +% +\def\psVector{\pst@object{psVector}} +\def\psVector@i(#1){% + \pst@killglue% + \addbefore@par{arrows=->,arrowsize=6pt}% + \pst@getcoor{#1}\pst@tempCoor% + \begingroup + \use@par% + \rput(! cp.X cp.Y ){% + \psline(0,0)(#1)% + \ifPst@markAngle + \psarc[style=psMarkAngleStyle](0,0){1}{0}{!\pst@tempCoor exch atan}% + \psline[style=psMarkAngleLineStyle](1.5,0)% + \fi}% + \pnode(! \pst@tempCoor \pst@number\psyunit div cp.Y add exch + \pst@number\psxunit div cp.X add exch ){\psVectorName\the\psVectorCtr}% + \global\advance\psVectorCtr by \@ne% + \endgroup% + \pst@Verb{%tx@Dict begin + \pst@tempCoor + \pst@number\psyunit div cp.Y add /cp.Y exch def + \pst@number\psxunit div cp.X add /cp.X exch def %end + }% + \ignorespaces} +% +\define@key[psset]{pstricks-add}{basename}{\def\psk@basename{#1}}% +\psset[pstricks-add]{basename=}% +% +\def\psCircleTangents{\pst@object{psCircleTangents}} +\def\psCircleTangents@i(#1){\@ifnextchar({\psCircleTangents@ii(#1)}{\psCircleTangents@iii(#1)}}% +\def\psCircleTangents@ii(#1)(#2)#3{% (viewpoint) (circle) {radius} + \pst@killglue% + \begingroup% + \pst@getlength{#3}\pst@LengthA% + \addbefore@par{basename=CircleT}% + \use@par% + \edef\@cmd{\noexpand\psEllipseTangentsN(#2)(! \pst@LengthA dup % + \pst@number\psxunit div exch \pst@number\psyunit div )(#1){\psk@basename}}% + \@cmd% + \endgroup% + \ignorespaces% +}% +\def\psCircleTangents@iii(#1)#2(#3)#4{% two circles--- (Cntr1){radius1}(Cntr2){radius2} + \pst@killglue% + \begingroup% + \pst@getlength{#2}\pst@LengthA% radius1 + \pst@getlength{#4}\pst@LengthB% radius2 + \addbefore@par{basename=CircleT}% + \use@par% + \psLCNodeVar(#1)(#3)(! \pst@LengthA \pst@number\psrunit div dup \pst@LengthB % + \pst@number\psrunit div % r1 r1 r2 on stack + 3 copy add div /tti ED sub dup 0 eq % r1 r1-r2 on stack + { pop pop /ttx 1000 def }{ div dup abs 1000 gt % r1/(r1-r2) on stack + { 0 gt { ttx 1000 def }{ ttx -1000 def } ifelse}{ /ttx ED } ifelse } ifelse % + 1 tti sub tti )% 1-tti tti on stack + {\psk@basename C1}% + % tti=r1/(r1+r2), ttx=r1/(r1-r2) + \psLCNodeVar(#1)(#3)(! 1 ttx sub ttx ){\psk@basename C2}% outside crossing pt + \expandafter\psCircleTangents@ii\expandafter(\psk@basename C1)(#1){#2}% + \pnode(CircleT1){\psk@basename I1}\pnode(CircleT2){\psk@basename I3}% + \expandafter\psCircleTangents@ii\expandafter(\psk@basename C1)(#3){#4}% + \pnode(CircleT1){\psk@basename I2}\pnode(CircleT2){\psk@basename I4}% + % external tangents + \expandafter\psCircleTangents@ii\expandafter(\psk@basename C2)(#1){#2}% + \pnode(CircleT1){\psk@basename O2}\pnode(CircleT2){\psk@basename O4}% + \expandafter\psCircleTangents@ii\expandafter(\psk@basename C2)(#3){#4}% + \pnode(CircleT1){\psk@basename O1}\pnode(CircleT2){\psk@basename O3}% + \endgroup% + \ignorespaces% +}% +% +\def\psEllipseTangents{\pst@object{psEllipseTangents}} +\def\psEllipseTangents@i(#1)(#2)(#3){% (Center)(axes)(viewpoint) + \pst@killglue{% + \use@par% only one parameter matters---psk@basename + \ifx\psk@basename\@empty \def\psk@basename{EllipseT}\fi % + \edef\@cmd{\noexpand\psEllipseTangentsN(#1)(#2)(#3){\psk@basename}}% + \@cmd}\ignorespaces}% +% +\def\psEllipseTangentsN(#1)(#2)(#3)#4{% (xe,ye)(a,b)(xP,yP){basename} % no optional arguments + \pst@killglue% + \pnode(#1){E@Cntr}% center of ellipse + \pnode(#2){@@TMP}% semimajor, semiminor + \pnode(#3){@@@TMP}% viewpt + \pst@getcoor{#3}\my@tempC% external viewpoint + \AtoB(E@Cntr)(@@@TMP){@TMP}% center to viewpoint + \ifnum\Pst@Debug>0 + \shownode(E@Cntr)% + \shownode(@TMP)% + \shownode(@@@TMP)% + \fi% + \pnode(! + \psGetNodeCenter{@@TMP}\space + /B @@TMP.y def% semiminor + /A @@TMP.x def% semimajor + /A2 A dup mul def /B2 B dup mul def + /C2 B A div dup mul def + \psGetNodeCenter{@TMP}\space + /Xp @TMP.x def /Yp @TMP.y def % center to viewpoint + /Xp2 Xp dup mul def /Yp2 Yp dup mul def + \psGetNodeCenter{E@Cntr}\space + /Xc E@Cntr.x def /Yc E@Cntr.y def + /R Xp2 A2 sub C2 mul Yp2 add Sqrt def % R=Sqrt{(Xp2-A2) C2 + Yp2} + /Q C2 Xp2 mul Yp2 add def % C2 Xp2 + Yp2 + /Xta B2 Xp mul A Yp R mul mul sub Q div def + /Yta Yp Xp R mul A div add B2 mul Q div def + /Xtb B2 Xp mul A Yp R mul mul add Q div def + /Ytb Yp Xp R mul A div sub B2 mul Q div def + 0 Xta Yp mul Yta Xp mul sub gt % swap a, b + { /A Xta def /B Yta def /Xta Xtb def /Yta Ytb def /Xtb A def /Ytb B def } if + Xta Xc add Yta Yc add ) {#42}% + \pnode(! Xtb Xc add Ytb Yc add ) {#41}% + \ignorespaces}% +% +\define@key[psset]{pstricks-add}{rotate}{\def\psk@rotate{#1 }} +\psset[pstricks-add]{rotate=0} + +\def\pst@saveDegrees{} + +\def\psKiviat{\pst@object{psKiviat}} +\def\psKiviat@i#1#2{% #1: number of edges #2 radius + \gdef\pst@saveDegrees{#1} + \begingroup% + \degrees[#1]% + \SpecialCoor% + \addbefore@par{rotate=0} + \use@par% + \global\let\psk@@rotate\psk@rotate + \def\pst@Coordinates{} + \psLoop{#1}{\xdef\pst@Coordinates{\pst@Coordinates(#2;\the\psLoopIndex)}} + \rput{\psk@rotate}(0,0){\expandafter\pspolygon\pst@Coordinates + \multido{\nA=0+1}{#1}{\uput{\pslabelsep}[\nA]{*0}(#2;\nA){\psPutYLabel{\nA}}}} + \endgroup% + \ignorespaces} +% +\def\psKiviatLine{\pst@object{psKiviatLine}} +\def\psKiviatLine@i#1{{% + \addbefore@par{showpoints}% + \use@par% + \degrees[\pst@saveDegrees]% + \psKiviatLine@ii#1\@nil}}% +\def\psKiviatLine@ii#1,#2\@nil{% + \global\pst@cntm=0 + \global\pst@cntn=1 + \begingroup + \xdef\pst@saveCoors{} + \psKiviatLine@iii#1,#2,#1,,\@nil + \rput{\psk@@rotate}(0,0){\expandafter\pspolygon\pst@saveCoors} +} +\def\psKiviatLine@iii#1,#2,#3\@nil{% + \ifx\relax#2\relax\else%\psline(#1;\the\pst@cntm)(#2;\the\pst@cntn) + \xdef\pst@saveCoors{\pst@saveCoors(#1;\the\pst@cntm)}\fi + \advance\pst@cntm\@ne + \advance\pst@cntn\@ne + \ifx\relax#3\relax\endgroup\else\psKiviatLine@iii#2,#3\@nil\fi} +% +\def\psKiviatTicklines{\pst@object{psKiviatTicklines}} +\def\psKiviatTicklines@i#1#2{{% n, radius + \degrees[#1]% + \use@par% + \pstFPDiv\pst@tempN{#2}{\psk@Dx}% + \pst@cntm=\pst@tempN \advance\pst@cntm by \m@ne + \multido{\rA=\psk@Dx+\psk@Dx}{\the\pst@cntm}{% + \def\pst@Coordinates{}% + \psLoop{#1}{\xdef\pst@Coordinates{\pst@Coordinates(\rA;\the\psLoopIndex)}}% + \rput{\psk@@rotate}(0,0){\expandafter\pspolygon\pst@Coordinates}% + }% +}\ignorespaces}% +% +\def\psKiviatAxes{\pst@object{psKiviatAxes}} +\def\psKiviatAxes@i#1#2{{% + \degrees[#1] + \use@par% + \multido{\iA=0+1}{#1}{\rput{\psk@@rotate}(0,0){\psline(0,0)(#2;\iA)}}% + }\ignorespaces}% +% +\def\resetOptions{% + \def\pst@linetype{0}% + \pstScalePoints(1,1){}{}% + \psset[pstricks-add]{% + hooklength=3mm, hookwidth=1mm, + ArrowFill=true, + ArrowInside={}, ArrowInsidePos=0.5, + ArrowInsideNo=1, ArrowInsideOffset=0, + randomPoints=1000,color=false, + whichabs={},whichord={}, + plotfuncx={},plotfuncy={},buildvector=false, + Derive={},adamsorder=4, + Tnormal=false, + braceWidth=2\pslinewidth, + bracePos=0.5, + braceWidthInner=10\pslinewidth, + braceWidthOuter=10\pslinewidth, + chartNodeI=0.75, + chartNodeO=1.5, + markAngle=false, + }} +% +\resetOptions +% +\catcode`\@=\PstAtCode\relax +% +%% END: pstricks-add.tex +\endinput + -- 2.20.1