Equivalente PGF do movimento relativo PostScript (`rlineto` e `rmoveto`)

Equivalente PGF do movimento relativo PostScript (`rlineto` e `rmoveto`)

Assim como o PostScript (com seus rmovetoe rlineto), o TikZ torna trivial a produção de movimento relativo do ponto atual. Não estou vendo nada equivalente no PGF. Está faltando? Se sim, é fácil dizer por quê? (E qual é a substituição pretendida no PFG?) Mesmo que o movimento relativo não seja de nível baixo o suficiente para a camada do sistema (difícil de acreditar?), parece de nível baixo o suficiente para a camada base.

Editar (consultas relacionadas):Está \pgfrelativeobsoleto (não está no manual atual)? E qual comando PGF produz o ponto atual?

Responder1

No exemplo a seguir, são fornecidas duas novas macros \pgfpathrlineto{<coord>}e . \pgfpathrmoveto{<coord>}Eles não foram totalmente testados, então tome cuidado.

Na verdade, precisamos acompanhar as coordenadas originais (não transformadas) do último ponto, mas aqui \pgf@xe \pgf@yarmazenar as coordenadas transformadas.

A questão é, em (x, y) -- ++(2, 3), a linha esperada antes da transformação é (x, y) -- (x+2, y+3), enquanto o que implementei no exemplo a seguir é (x, y) -- ($ (x, y) + T'(2, 3) $), onde T'está a inversão da transformação.

\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}

insira a descrição da imagem aqui

informação relacionada