[pstricks] tangential vector

Martin Chicoine martin.chicoine at umontreal.ca
Thu Apr 9 19:20:24 CEST 2009


> -----Message d'origine-----
> De : pstricks-bounces at tug.org [mailto:pstricks-bounces at tug.org] De la
> part de Doris Wagner
> Envoyé : 8 avril 2009 11:46
> À : Graphics PSTricks with
> Objet : [pstricks] tangential vector
> 
> hi list,
> 
> I have a graph which shows a trajectory (e.g. polynomial) of a
> physical object and I want to draw the tangent vector. the problem
> with \psplotTangent is that it goes in two directions from one point
> of the graph. is there a possibility to get only half of it?
> 
> d

Here is a version that extends from -#2 to #3, with #1 being the x point and
#4 being the function:

\psplotTangent{#1}{#2}{#3}{#4}

-------------------------------

\documentclass{article}

\usepackage{pstricks-add}

\makeatletter
\def\psplotTangent at i#1#2#3#4{%
  \begin at OpenObj%
%  \let\pst at linetype\pst at arrowtype%
%  \pst at addarrowdef%
  \ifx\psk at Derive\@empty\ifPst at algebraic\psset{Derive=NOT at EMPTY}\fi\fi%%dr
0606
  \addto at pscode{
    gsave % save current state
    /F at pstplot \ifPst at algebraic (#4) tx at addDict begin AlgParser end cvx
\else { #4 } \fi def % define function
    \ifx\psk at Derive\@empty\else
    \ifx\psk at Derive\@NOTEMPTY\else%%dr 0606
      /FDer at pstplot % do we have a derivation defined?
        \ifPst at algebraic (\psk at Derive) tx at addDict begin AlgParser end cvx
\else { \psk at Derive } \fi def % define derivation
    \fi%%dr 0606
    \fi
    /@parametric false def %%dr 0606
    % first we calculate the origin
    #1 dup /x ED /t ED tx at addDict begin mark F at 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 at polarplot x \ifPst at algebraic RadtoDeg \fi PtoC /y ED /x ED
\else /y ED \fi } ifelse 
    cleartomark 
    \ifx\psk at Derive\@NOTEMPTY%%begin dr 0606
        %% algebraic we can use the derivative machine
        /FDer at pstplot (#4) @parametric { (t) } { (x) } ifelse
        tx at Derive begin Derive end tx at addDict begin AlgParser end cvx def
    \fi%%end dr 0606
    x \pst at number\psxunit mul y \pst at number\psyunit mul 
    translate % define the temporary origin
    % now we calculate the slope of the tangent 
    \ifx\psk at Derive\@empty% de we have a derivation defined?
      #1 abs 1.0e-6 lt % no, we choose secant for the tangent 
      { #1 0.0005 add dup /x ED /t ED tx at addDict begin mark F at pstplot end
counttomark 1 gt % test, if we have parametricplot
        { /y2 ED /x2 ED }  % we have 2 values
        { \ifPst at polarplot dup x \ifPst at algebraic RadtoDeg \fi 
	  cos mul /x2 ED x \ifPst at algebraic RadtoDeg \fi sin mul \else /x2 x
def \fi /y2 ED } ifelse
        cleartomark % delete the mark
        #1 0.0005 sub dup /x ED /t ED tx at addDict begin mark F at pstplot end
counttomark 1 gt % test, if we have parametricplot
          { /y1 ED /x1 ED }
	  { \ifPst at polarplot dup x \ifPst at algebraic RadtoDeg \fi 
	    cos mul /x1 ED x \ifPst at 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
        #1 1.0005 mul dup /x ED /t ED tx at addDict begin mark F at pstplot end
counttomark 1 gt % test, if we have parametricplot 
          { /y2 ED /x2 ED } % we have 2 values
          { \ifPst at polarplot dup x \ifPst at algebraic RadtoDeg \fi 
	    cos mul /x2 ED x \ifPst at algebraic RadtoDeg \fi sin mul \else /x2
x def \fi /y2 ED } ifelse
	cleartomark 
        #1 .9995 mul dup /x ED /t ED tx at addDict begin mark F at pstplot end
counttomark 1 gt % test, if we have parametricplot 
          { /y1 ED /x1 ED } % we have 2 values 
          { \ifPst at polarplot dup x \ifPst at algebraic RadtoDeg \fi 
	    cos mul /x1 ED x \ifPst at algebraic RadtoDeg \fi sin mul \else /x1
x def \fi /y1 ED } ifelse
	cleartomark 
        y2 y1 sub \pst at number\psyunit mul x2 x1 sub \pst at number\psxunit mul
} ifelse 
      atan %  atan(dy dx), we have the slope angle of the secant
    \else % there is a derivation defined
    #1 dup /x ED /t ED tx at addDict begin mark FDer at pstplot end counttomark 1
gt % test, if we have parametricplot 
      { /y ED /x ED }
      { \ifPst at polarplot /Fphi ED % the value F'(phi) 
           tx at addDict begin F at pstplot end x \ifPst at algebraic RadtoDeg \fi
PtoC /y0 ED /x0 ED % the x y values
           x \ifPst at algebraic RadtoDeg \fi sin Fphi mul x0 add /y ED 
           x \ifPst at algebraic RadtoDeg \fi cos Fphi mul y0 sub /x ED 
      \else /y ED /x 1 def \fi } ifelse
    cleartomark 
    y \pst at number\psyunit mul x \pst at number\psxunit mul Atan \ifPST at Tnormal
90 add \fi
%    y ATAN1  % we have the slope angle of the tangent. ATAN is defined int
the pstricks.pro, patch 6
    \fi
    rotate 					% rotate, depending to the
origin
    /Lineto /lineto load def
    [
    \ifPST at Tnormal
      0 0 % moveto
      #2 
      y \pst at number\psyunit mul x \pst at number\psxunit mul Atan 90 add cos
div \pst at number\psxunit mul 0  % lineto
    \else    
      -#2 \pst at number\psxunit mul 0 		% moveto
       #3 \pst at number\psxunit mul 0 		% lineto
    \fi
    \pst at cp					% kill the currentpoint, if
any
    false					% don't show the points
    \tx at Line
%      ArrowA CP 4 2 roll ArrowB L          	% the line with arrows L is
defined in pstricks.pro
%     \pst at number\pslinewidth SLW		% set linewidth in pt
%     \@nameuse{psls@\pslinestyle}           	% linestyle
%     \pst at usecolor\pslinecolor			% linecolor
    stroke					% stroke everything
    \ifshowpoints 				% show the points?
      \psk at dotsize
      \@nameuse{psds@\psk at dotstyle}%
      0 0 Dot
    \fi
    grestore					% restore old graphics state
   }%
  \use at pscode					% part of \end at OpenObj
  \endgroup%					% part of \end at OpenObj
  \ignorespaces%				% part of \end at OpenObj
}%
\makeatother

\begin{document}

\psset{algebraic}

\begin{psgraph}(0,0)(-3,0)(3,10){1\textwidth}{5.4cm}
  \psplot{-3}{3}{x^2}
  \psplotTangent[linecolor=red]{2}{1}{3}{x^2}
\end{psgraph}

\end{document}



More information about the PSTricks mailing list