Эквивалент PGF относительного перемещения PostScript (`rlineto` и `rmoveto`)

Эквивалент PGF относительного перемещения PostScript (`rlineto` и `rmoveto`)

Как и PostScript (с его rmovetoи rlineto), TikZ делает тривиальным создание относительного перемещения текущей точки. Я не вижу ничего эквивалентного в PGF. Его не хватает? Если да, то легко ли сказать, почему? (И какая предполагаемая замена в PFG?) Даже если относительное перемещение недостаточно низкоуровневое для системного уровня (трудно поверить?), оно кажется достаточно низкоуровневым для базового уровня.

Редактировать (Похожие запросы):Устарело \pgfrelative(его нет в текущем руководстве)? И какая команда PGF выдает текущую точку?

решение1

В следующем примере предоставлены два новых макроса \pgfpathrlineto{<coord>}и . Они не полностью протестированы, поэтому будьте осторожны.\pgfpathrmoveto{<coord>}

На самом деле нам нужно отслеживать исходные (непреобразованные) координаты последней точки, а здесь \pgf@xхранить \pgf@yпреобразованные координаты.

Дело в том, что в (x, y) -- ++(2, 3)ожидаемая строка до преобразования — это (x, y) -- (x+2, y+3), тогда как в следующем примере я реализовал (x, y) -- ($ (x, y) + T'(2, 3) $), где T'— инверсия преобразования.

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

введите описание изображения здесь

Связанный контент