PGF 相當於 PostScript 相對移動(`rlineto` 和 `rmoveto`)

PGF 相當於 PostScript 相對移動(`rlineto` 和 `rmoveto`)

與 PostScript(帶有rmovetorlineto)一樣,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}

在此輸入影像描述

相關內容