Tikz: La posición de una etiqueta cambia paso a paso y no de forma continua

Tikz: La posición de una etiqueta cambia paso a paso y no de forma continua

Considere el siguiente MEW. No entiendo por qué la posición de la etiqueta de i2 cambia paso a paso y no de forma continua. Con 178-180 obtengo

ingrese la descripción de la imagen aquí

Con 175-177 me sale

ingrese la descripción de la imagen aquí

El primero es demasiado bajo, el segundo demasiado alto... ¿Es un error mío o una debilidad del sistema?

\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usetikzlibrary{calc,patterns,angles,quotes,intersections}
\begin{document}
\noindent\hrulefill
\begin{center}
\begin{tikzpicture}[scale=0.5,
  dot/.style 2 args={circle,inner sep=1pt,fill,label={#2},name=#1},
  dot2/.style 2 args={circle,inner sep=.6pt,draw=black, fill=white,label={#2},name=#1},
  dot3/.style 2 args={circle,inner sep=.8pt,draw=black, fill=white,label={#2},name=#1},
  extended line/.style={shorten >=-#1,shorten <=-#1},
  extended line/.default=1cm]

  \draw[help lines,step=1] (-1,-1) grid (10,6);
  \draw [->] (-1,0) -- (10,0) node [below left]  {$x$};
  \draw [->] (0,-1) -- (0,6) node [below left] {$y$};

  \node [dot={p1}{[below=1.5mm]$p_1$}] at (3,1) {};
  \node [dot={p2}{[above right]$p_2$}] at (8,0) {};
  \node [dot={p3}{[above=1mm]$p_3$}] at (3.5,2.5) {};
  \node [dot={p4}{[above right]$p_4$}] at (6,3) {};

  \coordinate (i1) at (intersection of p1--p2 and p3--p4);
  \coordinate (i2) at (intersection of p1--p3 and p2--p4);
  \draw [extended line=0.3cm] (p2) -- (i1) ;
  \draw [extended line=0.3cm] (p2) -- (i2) ;
  \draw [extended line=0.3cm] (p4) -- (i1) ;
  \draw [extended line=0.3cm] (p1) -- (i2) ;
  \draw [thick] (p1) -- (p2);
  \draw [thick] (p2) -- (p4);
  \draw [thick] (p3) -- (p4);
  \draw [thick] (p3) -- (p1);
  \draw [very thick,extended line=0.3cm] (i1) -- (i2) ;
  \coordinate (i3) at (intersection of p2--p3 and i1--i2);
  \coordinate (o) at (intersection of p2--p3 and p1--p4);
  \coordinate (i4) at (intersection of i1--o and p2--p4);
  \coordinate (i5) at (intersection of i2--o and p1--p2);
  \coordinate (i6) at (intersection of i1--o and p1--p3);
  \coordinate (i7) at (intersection of i2--o and p3--p4);
  \draw [very thin,extended line=0.3cm] (p1) -- (p4) ;
  \draw [very thin,extended line=0.3cm] (p2) -- (i3) ;
  \draw [very thin,extended line=0.3cm] (i1) -- (i4) ;
  \draw [very thin,extended line=0.3cm] (i2) -- (i5) ;
  \node[dot2,label={}] at (o) {};
  \node[dot2,label={}] at (i4) {};
  \node[dot2,label={}] at (i5) {};
  \node[dot2,label={}] at (i6) {};
  \node[dot2,label={}] at (i7) {};
  \node[dot3,label={[above]$i_1$}] at (i1) {};
  \node[dot3,label={[label distance=0mm]176.0:$i_2$}] at (i2) {}; % <<<=====
\end{tikzpicture}
\end{center}
\noindent\hrulefill
\end{document}

Respuesta1

El comportamiento que encontró está debidamente documentado en elManual de TikZ y PGF, precisamente en la página 247 para la versión 3.1.4b. Citas relevantes:

  1. El 〈ángulo〉 se utiliza para determinar una posición en el borde del nodo principal. (...)
  2. Luego, se calcula un punto de anclaje para el nodo de etiqueta. Está determinado de tal manera que la label nodevoluntad “de espaldas” al borde del main node. (...) Para ángulos entre estos ángulos “mayores”, como 30° o 110°, se utilizan anclajes combinados, como south westpara 30° o 110°. south eastSin embargo, para ángulos cercanos a los ángulos mayores (que difieren hasta 2° del ángulo mayor), se utiliza el anclaje para el ángulo mayor. Así, una etiqueta en un punto fronterizo de 2° tendrá el ancla west, mientras que una etiqueta de 3° tendrá el ancla south west, resultando en un “salto” del ancla. Puede configurar el ancla “a mano” usando la anchortecla o teclas indirectas como left.

Entonces, para lograr un posicionamiento preciso, use la sugerencia dada en los comentarios (me gusta \path (i2) ++(160:1.5em) node{$i_2$} ;) o aplique lo que dice la última oración citada usando la anchoropción, como en

\node[label={[label distance=0mm, anchor=0] 180:$i_2$}] at (i2) {};

o

\node[label={[label distance=0mm, anchor=357] 177:$i_2$}] at (i2) {};

Aquí, 177corresponde a 〈ángulo〉 en la cita anterior del manual y es relativo al nodo vacío creado por \node (...) at (i2) {};(el valor predeterminado es above, es decir, 90), mientras que anchor=357se refiere al nodo creado por la labelopción. Mantuve una diferencia de 180° entre ellos para que estuvieran uno frente al otro. Aquí está el resultado con:

\node[label={[label distance=0mm, anchor=345] 165:$i_2$}] at (i2) {};

captura de pantalla

Para entender bien el posicionamiento, sugiero probar algo como esto:

\node[name=aaa, draw,
      label={[draw, label distance=0mm, anchor=345] 165:$i_2$}]
  at (i2) {};
\fill[red] (aaa.165) circle (1pt);

captura de pantalla

De esta manera, la función que asigna el ángulo a la $i_2$etiqueta es continua (módulo la precisión limitada de la representación de punto flotante), pero como se menciona en los comentarios, se puede hacer la función aún más regular usando la circleforma para ambos nodos:

\node[name=aaa, circle, draw,
      label={[circle, draw, label distance=0mm, anchor=345] 165:$i_2$}]
  at (i2) {};
\fill[red] (aaa.165) circle (1pt);

captura de pantalla

Nota: label distancese sigue de acuerdo con la dirección determinada por 〈ángulo〉 en las opciones del nodo principal, no con la dirección indicada en anchorla labelopción. Por alguna razón que no sé, parece que la distancia entre ambas anclas de interés es ladoblede lo indicado con la label distanceopción:

\node[name=aaa, circle, draw,
      label={[name=bbb, circle, draw, label distance=8mm, anchor=310] 270:$i_2$}]
  at (i2) {};
\fill[red] (aaa.270) circle (1pt);
\fill[blue] (bbb.310) circle (1pt);
\draw[orange!35, <->] (aaa.270) -- node[right] {$d$} +(0,-16mm);

captura de pantalla

Respuesta2

Demasiado tiempo para un comentario.
Se puede observar una variación continua para niveles más altos label distance.

ingrese la descripción de la imagen aquí

\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usetikzlibrary{calc,patterns,angles,quotes,intersections}
\begin{document}
\begin{tikzpicture}[
  dot3/.style 2 args={circle,inner sep=.8pt,fill=black,label={#2},name=#1},]

  \coordinate (i2) at (0,0);
  \draw[thin,gray] (i2) -- ++(178:105mm);
  \draw[thin,gray] (i2) -- ++(179:105mm);
  \draw[thin,gray] (i2) -- ++(180:105mm);

  \node[dot3,label={[label distance=0mm]178.0:$i_2$}] at (i2) {}; % <<<=====
  \node[dot3,label={[label distance=0mm]179.0:$i_2$}] at (i2) {}; % <<<=====
  \node[dot3,label={[label distance=0mm]180.0:$i_2$}] at (i2) {}; % <<<=====  

  \node[dot3,label={[label distance=50mm,blue]178.0:$i_2$}] at (i2) {}; % <<<=====
  \node[dot3,label={[label distance=50mm,blue]179.0:$i_2$}] at (i2) {}; % <<<=====
  \node[dot3,label={[label distance=50mm,blue]180.0:$i_2$}] at (i2) {}; % <<<=====  

  \node[dot3,label={[label distance=100mm,red]178.0:$i_2$}] at (i2) {}; % <<<=====
  \node[dot3,label={[label distance=100mm,red]179.0:$i_2$}] at (i2) {}; % <<<=====
  \node[dot3,label={[label distance=100mm,red]180.0:$i_2$}] at (i2) {}; % <<<=====

\end{tikzpicture}
\end{document}

información relacionada