Tikz: A posição de um rótulo muda passo a passo e não de forma contínua

Tikz: A posição de um rótulo muda passo a passo e não de forma contínua

Considere o seguinte MEW. Não entendo porque a posição do rótulo do i2 muda gradativamente e não de forma contínua. Com 178-180 eu consigo

insira a descrição da imagem aqui

Com 175-177 eu consigo

insira a descrição da imagem aqui

O primeiro é muito baixo, o segundo é muito alto... É um erro meu ou uma fraqueza do 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}

Responder1

O comportamento que você encontrou está devidamente documentado noManual do TikZ & PGF, precisamente na página 247 para a versão 3.1.4b. Citações relevantes:

  1. O 〈ângulo〉 é usado para determinar uma posição na borda do nó principal. (...)
  2. Então, um ponto de ancoragem para o nó rótulo é calculado. É determinado de tal forma que a label nodevontade “ficará de costas” para a fronteira do main node. (...) Para ângulos entre esses ângulos “maiores”, como 30° ou 110°, são utilizadas âncoras combinadas, como south westpara 30° ou south eastpara 110°. Porém, para ângulos próximos aos ângulos maiores (diferindo em até 2° do ângulo maior), é utilizada a âncora para o ângulo maior. Assim, um rótulo em um ponto de borda para 2° terá a âncora west, enquanto um rótulo para 3° terá a âncora south west, resultando em um “salto” da âncora. Você pode definir a âncora “manualmente” usando a anchortecla ou teclas indiretas como left.

Portanto, para obter um posicionamento preciso, use a sugestão dada nos comentários (como \path (i2) ++(160:1.5em) node{$i_2$} ;) ou aplique o que diz a última frase citada usando a anchoropção, como em

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

ou

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

Aqui, o 177corresponde ao 〈ângulo〉 na citação acima do manual e é relativo ao nó vazio criado por \node (...) at (i2) {};(o padrão é above, ou seja, 90), enquanto o anchor=357refere-se ao nó criado pela labelopção. Mantive uma diferença de 180° entre eles para que fiquem frente a frente. Aqui está a saída com:

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

captura de tela

Para entender bem o posicionamento, sugiro tentar algo assim:

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

captura de tela

Desta forma, a função que mapeia o ângulo para o $i_2$rótulo é contínua (módulo a precisão limitada da representação de ponto flutuante), mas como mencionado nos comentários, pode-se tornar a função ainda mais regular usando a circleforma para ambos os nós:

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

Nota: o label distanceé seguido de acordo com a direção determinada por 〈ângulo〉 nas opções do nó principal, e não a direção indicada com anchorna labelopção. Por alguma razão que não sei, parece que a distância entre as duas âncoras de interesse é adobrodaquele indicado com a label distanceopção:

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

Responder2

Muito tempo para um comentário.
Variação contínua pode ser vista para níveis mais altos label distance.

insira a descrição da imagem aqui

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

informação relacionada