Como posso usar o pgf no TikZ

Como posso usar o pgf no TikZ

Antecedentes: eu entendo que TikZ é construído em cima do pgf. Ambos estão descritos no manual do pgf. No entanto, não consegui encontrar a seção (se existir) do manual que descreve como os dois estão conectados. Isso é um problema para mim, pois gosto das construções de alto nível do TikZ, ainda noto uma série de primitivas úteis no pgf que não sei como acessar.

Como exemplo, considere esta imagem simples:

dois segmentos de linha e a interseção de suas extensões

Existem dois segmentos de linha curtos e sem interseção. O círculo marca o ponto onde as linhas estendidas se encontram. Os segmentos de linha e rótulos de nós foram criados com TikZ, a intersecção com pgf.

Aqui está o código, retirado do manual e ligeiramente adaptado:

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[x=20mm,y=20mm]
  \draw
  (.5,0) node[left](A){$A$} -- (1,.8) node[left]{B}
  (2,0) node[left](C){$C$} -- (1.5,1) node[right](D){D};
  \pgfpathcircle{%
    \pgfpointintersectionoflines
      {\pgfpointxy{.5}{0}}{\pgfpointxy{1}{.8}}
      {\pgfpointxy{2}{0}}{\pgfpointxy{1.5}{1}}}
    {2pt}
  \pgfusepath{stroke}
\end{tikzpicture}
\end{document}

Claramente, o código não é DRY: as coordenadas são repetidas na seção pgf. Mas se os pontos A – D fossem eles próprios o resultado de cálculos, esta não seria uma opção viável. Além disso, eu possoempateo ponto de intersecção, mas não possousarem trabalhos futuros no TikNível Z. Daí minhas perguntas:

  • Como represento os pontos A – D em termos que \pgfpointintersectionoflinese outras construções pgf podem usar?
  • E como faço para extrair o resultado do mundo pgf, para uso posterior no TikMundo Z?

Observe que estou procurando respostas que possam ser generalizadas, e não um hack que se aplique apenas ao problema atual.

Responder1

Além do que Torbjørn T. diz, você pode usar nós/coordenadas existentes com \pgfpointanchor{<name>}{<anchor>}.

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[x=20mm,y=20mm]
  \draw
  (.5,0) node[left](A){$A$} -- (1,.8) node[left](B){B}
  (2,0) node[left](C){$C$} -- (1.5,1) node[right](D){D};  
   \pgfcoordinate{aux}{\pgfpointintersectionoflines
      {\pgfpointanchor{A}{east}}{\pgfpointanchor{B}{east}}
      {\pgfpointanchor{C}{east}}{\pgfpointanchor{D}{west}}}
   \pgfpathcircle{\pgfpointanchor{aux}{center}}{2pt}
  \pgfusepath{stroke}
  \draw (aux) -- (aux|-A.south);
\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Responder2

Eu mesmo encontrei outra solução. Não é tão bom quanto a resposta da marmota, mas como é uma abordagem diferente para o mesmo problema, possivelmente permitindo um conjunto diferente de opções, ofereço aqui, para registro:

\documentclass[tikz]{standalone}
\usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}[x=20mm,y=20mm]
  \draw
  (.5,0) coordinate(A) node[left]{$A$} -- (1,.8) coordinate(B) node[left]{B}
  (2,0) coordinate(C) node[left]{$C$} -- (1.5,1) coordinate(D) node[right]{D};
  \tikzmath{
    coordinate \A; \A = (A);
    coordinate \B; \B = (B);
    coordinate \C; \C = (C);
    coordinate \D; \D = (D); }
  \pgfcoordinate{E}{
    \pgfpointintersectionoflines
      {\pgfpoint{\Ax}{\Ay}}{\pgfpoint{\Bx}{\By}}
      {\pgfpoint{\Cx}{\Cy}}{\pgfpoint{\Dx}{\Dy}}}
  \draw (E) circle[radius=2pt];
\end{tikzpicture}
\end{document}

No processo de chegar lá, aprendi a diferença entre \pgfpoint(coordenadas da tela?) e \pgfpointxy(coordenadas do usuário).

informação relacionada