Tikz: Die Position eines Etiketts ändert sich schrittweise und nicht kontinuierlich

Tikz: Die Position eines Etiketts ändert sich schrittweise und nicht kontinuierlich

Betrachten Sie das folgende MEW. Ich verstehe nicht, warum sich die Position des Etiketts von i2 schrittweise und nicht kontinuierlich ändert. Mit 178-180 bekomme ich

Bildbeschreibung hier eingeben

Mit 175-177 bekomme ich

Bildbeschreibung hier eingeben

Der erste ist zu niedrig, der zweite zu hoch... Ist es ein Fehler meinerseits oder eine Schwäche des Systems?

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

Antwort1

Das von Ihnen festgestellte Verhalten ist ordnungsgemäß dokumentiert in derTikZ- und PGF-Handbuch, und zwar auf Seite 247 für Version 3.1.4b. Relevante Zitate:

  1. Der 〈Winkel〉 wird verwendet, um eine Position am Rand des Hauptknotens zu bestimmen. (...)
  2. Dann wird ein Ankerpunkt für den Beschriftungsknoten berechnet. Er wird so bestimmt, dass der label nodevom Rand des „wegzeigt“ main node. (...) Für Winkel zwischen diesen „Hauptwinkeln“, beispielsweise 30° oder 110°, werden kombinierte Anker, beispielsweise south westfür 30° oder south eastfür 110° , verwendet. Für Winkel in der Nähe der Hauptwinkel (die bis zu 2° vom Hauptwinkel abweichen) wird jedoch der Anker für den Hauptwinkel verwendet. Daher hat eine Beschriftung an einem Randpunkt für 2° den Anker west, während eine Beschriftung für 3° den Anker hat south west, was zu einem „Sprung“ des Ankers führt. Sie können den Anker „von Hand“ mit der anchorTaste oder indirekten Tasten wie setzen left.

Um eine präzise Positionierung zu erreichen, verwenden Sie entweder den in den Kommentaren gegebenen Vorschlag (wie \path (i2) ++(160:1.5em) node{$i_2$} ;) oder wenden Sie das an, was im letzten zitierten Satz steht, indem Sie die anchorOption verwenden, wie in

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

oder

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

Hier 177entspricht das dem 〈Winkel〉 im obigen Zitat aus dem Handbuch und ist relativ zum leeren Knoten, der von erstellt wurde \node (...) at (i2) {};(der Standardwert ist above, also 90), während das anchor=357den Knoten betrifft, der von der labelOption erstellt wurde. Ich habe einen Unterschied von 180° zwischen ihnen gelassen, sodass sie einander gegenüberliegen. Hier ist die Ausgabe mit:

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

Bildschirmfoto

Um die Positionierung gut zu verstehen, schlage ich vor, so etwas zu versuchen:

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

Bildschirmfoto

Auf diese Weise ist die Funktion, die den Winkel auf die Beschriftung abbildet, $i_2$kontinuierlich (modulo der begrenzten Genauigkeit der Gleitkommadarstellung), aber wie in den Kommentaren erwähnt, kann man die Funktion noch regelmäßiger machen, indem man die circleForm für beide Knoten verwendet:

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

Bildschirmfoto

Hinweis: Die label distancewird gemäß der durch 〈angle〉 in den Hauptknotenoptionen festgelegten Richtung verfolgt, nicht gemäß der anchorin der labelOption angegebenen Richtung. Aus irgendeinem Grund, den ich nicht kenne, scheint es jedoch so, dass der Abstand zwischen den beiden Ankerpunkten derdoppeltdavon mit der label distanceOption angegeben:

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

Bildschirmfoto

Antwort2

Zu lang für einen Kommentar.
Bei höheren Werten sind kontinuierliche Variationen zu erkennen label distance.

Bildbeschreibung hier eingeben

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

verwandte Informationen