Does a zero-length line with an arrow make sense? Is it a bug?

With pstricks.tex from http://archiv.dante.de/~herbert/texnik/tex/generic/pstricks/ \psLine can have only one or two pairs of coordinates. Will later be on CTAN.

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-node,multido}
\begin{document}
\multido{\i=0+30}{12}{%
\begin{pspicture}(-2,-2)(2,2)
    \pscircle{1}
    \pnode(1;\i){R}
    \psset{arrows=->}
    \psLine(R)
    \psLine[linecolor=blue](R|0,0)
    \psLine[linecolor=red](0,0|R)
    \psset{linecolor=gray,linestyle=dashed,linewidth=0.5\pslinewidth,arrows=-,dash=2pt 2pt}
    \psLine(R)(R|0,0)
    \psLine(R)(0,0|R)
\end{pspicture}}
\end{document}

enter image description here


In TikZ, you can avoid drawing arrow heads if the last segment of a path has a length of zero by patching the internal \pgf@check@for@arrows macro:

\makeatletter
\def\pgf@check@for@arrows{%
  \pgf@drawarrowsfalse%
  \ifx\pgf@startarrow\pgfutil@empty\else\pgf@drawarrowstrue\fi%
  \ifx\pgf@endarrow\pgfutil@empty\else\pgf@drawarrowstrue\fi%
  \ifdim\pgf@shorten@end@additional=0pt\relax\else\pgf@drawarrowstrue\fi%
  \ifdim\pgf@shorten@start@additional=0pt\relax\else\pgf@drawarrowstrue\fi%
  \ifpgf@drawarrows%
    \pgfsyssoftpath@getcurrentpath\pgf@arrowpath%
    \ifx\pgf@arrowpath\pgfutil@empty%
      \pgf@drawarrowsfalse%
    \else%
      \pgfprocesscheckclosed{\pgf@arrowpath}{\pgf@drawarrowsfalse}%
      %%% New stuff starts here
      % Extract first, second, second last and last points
      \pgfprocesspathextractpoints{\pgf@arrowpath}%
      % If the second last and last points are identical ...
      \ifx\pgfpointsecondlastonpath\pgfpointlastonpath%
        % ... disable the arrow head
        \pgf@drawarrowsfalse%
      \fi%
      %%% New stuff ends here
    \fi%
  \fi%
}
\makeatother

\documentclass[tikz,border=0pt]{standalone}
\usepackage{tikz}

\makeatletter
\def\pgf@check@for@arrows{%
  \pgf@drawarrowsfalse%
  \ifx\pgf@startarrow\pgfutil@empty\else\pgf@drawarrowstrue\fi%
  \ifx\pgf@endarrow\pgfutil@empty\else\pgf@drawarrowstrue\fi%
  \ifdim\pgf@shorten@end@additional=0pt\relax\else\pgf@drawarrowstrue\fi%
  \ifdim\pgf@shorten@start@additional=0pt\relax\else\pgf@drawarrowstrue\fi%
  \ifpgf@drawarrows%
    \pgfsyssoftpath@getcurrentpath\pgf@arrowpath%
    \ifx\pgf@arrowpath\pgfutil@empty%
      \pgf@drawarrowsfalse%
    \else%
      \pgfprocesscheckclosed{\pgf@arrowpath}{\pgf@drawarrowsfalse}%
      \pgfprocesspathextractpoints{\pgf@arrowpath}%
      \ifx\pgfpointsecondlastonpath\pgfpointlastonpath%
        \pgf@drawarrowsfalse%
      \fi%
    \fi%
  \fi%
}
\makeatother

\begin{document}
\foreach \angle in {0,5,...,355}{%
    \begin{tikzpicture}[
        scale=1.5,
        arrow/.style={
            -stealth, thick, line cap=round 
        }
    ]
        \fill [white] (-1.02,-1.02) rectangle (1.02, 1.02);
        \draw [gray, densely dashed] (0:{cos(\angle)}) |- (90:{sin(\angle)});
        \draw (0,0) circle [radius=1];
        \draw [blue, arrow] (0,0) -- (0:{cos(\angle)});
        \draw [red, arrow] (0,0) -- (90:{sin(\angle)});
        \draw [black, arrow] (0,0) -- (\angle:1);
    \end{tikzpicture}%
}
\end{document}