![Tikz: A posição de um rótulo muda passo a passo e não de forma contínua](https://rvso.com/image/400373/Tikz%3A%20A%20posi%C3%A7%C3%A3o%20de%20um%20r%C3%B3tulo%20muda%20passo%20a%20passo%20e%20n%C3%A3o%20de%20forma%20cont%C3%ADnua.png)
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
Com 175-177 eu consigo
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:
- O 〈ângulo〉 é usado para determinar uma posição na borda do nó principal. (...)
- Então, um ponto de ancoragem para o nó rótulo é calculado. É determinado de tal forma que a
label node
vontade “ficará de costas” para a fronteira domain node
. (...) Para ângulos entre esses ângulos “maiores”, como 30° ou 110°, são utilizadas âncoras combinadas, comosouth west
para 30° ousouth east
para 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 âncorawest
, enquanto um rótulo para 3° terá a âncorasouth west
, resultando em um “salto” da âncora. Você pode definir a âncora “manualmente” usando aanchor
tecla ou teclas indiretas comoleft
.
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 anchor
opçã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 177
corresponde 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=357
refere-se ao nó criado pela label
opçã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) {};
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);
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 circle
forma 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);
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 anchor
na label
opçã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 distance
opçã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);
Responder2
Muito tempo para um comentário.
Variação contínua pode ser vista para níveis mais altos label distance
.
\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}