Tikz: Положение метки меняется ступенчато, а не непрерывно

Tikz: Положение метки меняется ступенчато, а не непрерывно

Рассмотрим следующий MEW. Я не понимаю, почему положение метки i2 меняется ступенчато, а не непрерывно. При 178-180 я получаю

введите описание изображения здесь

С 175-177 я получаю

введите описание изображения здесь

Первый слишком низкий, второй слишком высокий... Это моя ошибка или слабость системы?

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

решение1

Поведение, с которым вы столкнулись, должным образом задокументировано вРуководство по TikZ и PGF, именно на странице 247 для версии 3.1.4b. Соответствующие цитаты:

  1. 〈Угол〉 используется для определения положения на границе основного узла. (...)
  2. Затем вычисляется точка привязки для узла метки. Она определяется таким образом, что будет label node«отвернута» от границы main node. (...) Для углов между этими «главными» углами, такими как 30° или 110°, используются комбинированные привязки, такие как south westдля 30° или south eastдля 110°. Однако для углов, близких к главным углам (отличающихся от главного угла до 2°), используется привязка для главного угла. Таким образом, метка в граничной точке для 2° будет иметь привязку west, в то время как метка для 3° будет иметь привязку south west, что приведет к «прыжку» привязки. Вы можете установить привязку «вручную», используя клавишу anchorили косвенные клавиши, такие как left.

Итак, чтобы добиться точного позиционирования, либо воспользуйтесь предложением, данным в комментариях (например, \path (i2) ++(160:1.5em) node{$i_2$} ;), либо примените то, что говорится в последнем цитируемом предложении, используя anchorопцию, как в

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

или

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

Здесь 177соответствует 〈angle〉 в приведенной выше цитате из руководства и относится к пустому узлу, созданному \node (...) at (i2) {};(по умолчанию above, т.е. 90), тогда как anchor=357касается узла, созданного опцией label. Я сохранил разницу в 180° между ними, чтобы они смотрели друг на друга. Вот вывод с:

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

Скриншот

Чтобы хорошо понять позиционирование, предлагаю попробовать что-то вроде этого:

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

Скриншот

Таким образом, функция, которая отображает угол на $i_2$метку, является непрерывной (по модулю ограниченной точности представления с плавающей точкой), но, как упоминалось в комментариях, можно сделать функцию еще более регулярной, используя форму circleдля обоих узлов:

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

Скриншот

Примечание: label distanceследует в соответствии с направлением, определенным 〈angle〉 в основных параметрах узла, а не направлением, указанным anchorв labelпараметре. По какой-то причине, которую я не знаю, кажется, что расстояние между двумя интересующими якорями равнодвойнойиз указанного с label distanceопцией:

\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);

Скриншот

решение2

Слишком долго для комментария.
Непрерывное изменение можно увидеть для более высоких 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}

Связанный контент