Как использовать pgf из TikZ?

Как использовать pgf из TikZ?

Предыстория: Я понимаю, что ТикZ построен на основе pgf. Оба описаны в руководстве pgf. Однако я не смог найти раздел (если он вообще существует) руководства, описывающий, как они связаны. Для меня это проблема, так как мне нравятся высокоуровневые конструкции TiкZ, однако я заметил ряд полезных примитивов в pgf, к которым не знаю, как получить доступ.

В качестве примера рассмотрим эту простую картинку:

два отрезка и пересечение их продолжений

Есть два коротких непересекающихся отрезка. Круг отмечает точку, где встречаются вытянутые линии. Отрезки и метки узлов были созданы с помощью TiкZ, пересечение с pgf.

Вот код, взятый из руководства и слегка адаптированный:

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

Очевидно, что код не DRY: координаты повторяются в разделе pgf. Но если бы точки A–D сами были результатом вычислений, это нежизнеспособный вариант. Также я могурисоватьточка пересечения, но я не могуиспользоватьэто в дальнейшей работе в TiкУровень Z. Отсюда мои вопросы:

  • Как представить точки A–D в терминах, которые \pgfpointintersectionoflinesмогут использовать и другие конструкции PGF?
  • И как мне извлечь результат из мира pgf, для дальнейшего использования в TiкМир Z?

Обратите внимание, что я ищу ответы, которые можно обобщить, а не приемы, применимые только к текущей проблеме.

решение1

В дополнение к тому, что говорит Торбьёрн Т., вы можете использовать существующие узлы/координаты с \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}

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

решение2

Я сам придумал другое решение. Оно не такое хорошее, как ответ marmot, но поскольку это другой подход к той же проблеме, возможно, дающий другой набор опций, я предлагаю его здесь, для протокола:

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

В процессе работы я узнал разницу между \pgfpoint(координатами холста?) и \pgfpointxy(координатами пользователя).

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