
Antecedentes: entiendo que TikZ está construido sobre pgf. Ambos se describen en el manual de pgf. Sin embargo, no he podido encontrar la sección (si es que existe) del manual que describe cómo se conectan los dos. Esto es un problema para mí, ya que disfruto de las construcciones de alto nivel de Ti.kZ, sin embargo, noto una serie de primitivas útiles en pgf a las que no sé cómo acceder.
Como ejemplo, considere esta imagen simple:
Hay dos segmentos de línea cortos que no se cruzan. El círculo marca el punto donde se unen las líneas extendidas. Los segmentos de línea y las etiquetas de los nodos fueron creados con Ti.kZ, la intersección con pgf.
Aquí está el código, extraído del manual y ligeramente 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, el código no es SECO: las coordenadas se repiten en la sección pgf. Pero si los puntos A-D fueran en sí mismos el resultado de cálculos, esta no sería una opción viable. Además, puedodibujarel punto de intersección, pero no puedousaren trabajos posteriores en el TikNivel Z. De ahí mis preguntas:
- ¿Cómo represento los puntos A – D en términos que
\pgfpointintersectionoflines
otras construcciones pgf puedan usar?- ¿Y cómo extraigo el resultado del mundo pgf para usarlo posteriormente en Ti?k¿Mundo Z?
Tenga en cuenta que estoy buscando respuestas que puedan generalizarse, no un truco que se aplique únicamente al problema actual.
Respuesta1
Además de lo que dice Torbjørn T., puede utilizar nodos/coordenadas existentes con \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}
Respuesta2
Yo mismo se me ocurrió otra solución. No es tan agradable como la respuesta de Marmot, pero como es un enfoque diferente al mismo problema, posiblemente permitiendo un conjunto diferente de opciones, lo ofrezco aquí, para que conste:
\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}
En el proceso de llegar allí, aprendí la diferencia entre \pgfpoint
(¿coordenadas del lienzo?) y \pgfpointxy
(coordenadas del usuario).