![Tikz: Положение метки меняется ступенчато, а не непрерывно](https://rvso.com/image/400373/Tikz%3A%20%D0%9F%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BC%D0%B5%D1%82%D0%BA%D0%B8%20%D0%BC%D0%B5%D0%BD%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D1%81%D1%82%D1%83%D0%BF%D0%B5%D0%BD%D1%87%D0%B0%D1%82%D0%BE%2C%20%D0%B0%20%D0%BD%D0%B5%20%D0%BD%D0%B5%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%BD%D0%BE.png)
Рассмотрим следующий 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. Соответствующие цитаты:
- 〈Угол〉 используется для определения положения на границе основного узла. (...)
- Затем вычисляется точка привязки для узла метки. Она определяется таким образом, что будет
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}