
Предыстория: Я понимаю, что Тик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
(координатами пользователя).