Equivalente PGF del movimiento relativo PostScript (`rlineto` y `rmoveto`)

Equivalente PGF del movimiento relativo PostScript (`rlineto` y `rmoveto`)

Al igual que PostScript (con su rmovetoy rlineto), TikZ hace que sea trivial producir un movimiento relativo del punto actual. No veo nada equivalente en PGF. ¿Falta? Si es así, ¿es fácil decir por qué? (¿Y cuál es el reemplazo previsto en PFG?) Incluso si el movimiento relativo no es lo suficientemente bajo para la capa del sistema (¿difícil de creer?), parece lo suficientemente bajo para la capa base.

Editar (consultas relacionadas):¿Está \pgfrelativeen desuso (no está en el manual actual)? ¿Y qué comando PGF produce el punto actual?

Respuesta1

En el siguiente ejemplo, se proporcionan dos nuevas macros \pgfpathrlineto{<coord>}y . \pgfpathrmoveto{<coord>}No están completamente probados, así que tenga cuidado.

En realidad, necesitamos realizar un seguimiento de las coordenadas originales (no transformadas) del último punto, pero aquí \pgf@xy \pgf@yalmacenar las coordenadas transformadas.

El punto es que, en (x, y) -- ++(2, 3), la línea esperada antes de la transformación es (x, y) -- (x+2, y+3), mientras que lo que implementé en el siguiente ejemplo es (x, y) -- ($ (x, y) + T'(2, 3) $), donde T'está la inversión de la transformación.

\documentclass{article}
\usepackage{pgf}

\makeatletter
\def\pgf@path@last@point{%
  \pgfpoint{\pgf@path@lastx}{\pgf@path@lasty}}

% rlineto
\def\pgfpathrlineto#1{%
  \pgf@process{#1}%
  \global\advance\pgf@x\pgf@path@lastx
  \global\advance\pgf@y\pgf@path@lasty
  % similar to \pgfpathlineto, but without applying transformation
  \pgf@nlt@lineto{\pgf@x}{\pgf@y}%
  \global\pgf@path@lastx=\pgf@x
  \global\pgf@path@lasty=\pgf@y
}

% rmoveto
\def\pgfpathrmoveto#1{%
  \pgf@process{#1}%
  \global\advance\pgf@x\pgf@path@lastx
  \global\advance\pgf@y\pgf@path@lasty
  % similar to \pgfpathlineto, but without applying transformation
  \pgf@nlt@moveto{\pgf@x}{\pgf@y}%
  \global\pgf@path@lastx=\pgf@x
  \global\pgf@path@lasty=\pgf@y
}
\makeatother

\begin{document}
\begin{pgfpicture}
  \pgfpathmoveto{\pgfpointorigin}
  \pgfpathlineto{\pgfpoint{20pt}{0pt}}
  \pgfpathmoveto{\pgfpoint{40pt}{0pt}}
  \pgfpathlineto{\pgfpoint{60pt}{0pt}}
  \pgfusepath{draw}
  
  \pgftransformshift{\pgfpoint{10pt}{10pt}}
  \pgfsetcolor{red}
  \pgfpathmoveto{\pgfpointorigin}
  \pgfpathlineto{\pgfpoint{20pt}{0pt}}
  \pgfpathmoveto{\pgfpoint{40pt}{0pt}}
  \pgfpathlineto{\pgfpoint{60pt}{0pt}}
  \pgfusepath{draw}
\end{pgfpicture}
\qquad
% use r(line|move)to
\begin{pgfpicture}
  \pgfpathmoveto{\pgfpointorigin}
  \pgfpathrlineto{\pgfpoint{20pt}{0pt}}
  \pgfpathrmoveto{\pgfpoint{20pt}{0pt}}
  \pgfpathrlineto{\pgfpoint{20pt}{0pt}}
  \pgfusepath{draw}
  
  \pgftransformshift{\pgfpoint{10pt}{10pt}}
  \pgfsetcolor{red}
  \pgfpathmoveto{\pgfpointorigin}
  \pgfpathrlineto{\pgfpoint{20pt}{0pt}}
  \pgfpathrmoveto{\pgfpoint{20pt}{0pt}}
  \pgfpathrlineto{\pgfpoint{20pt}{0pt}}
  \pgfusepath{draw}
\end{pgfpicture}
\end{document}

ingrese la descripción de la imagen aquí

información relacionada