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 手冊,正好位於版本 3.1.4b 的第 247 頁。相關報價:

  1. <angle> 用來決定主節點邊界上的位置。 (...)
  2. 然後,計算標籤節點的錨點。它是以這樣一種方式確定的,即label node意志「背向」邊界main node。 (...) 對於這些「主」角度之間的角度(如 30° 或 110°), 使用組合錨,如south west30° 或110°。south east然而,對於接近主角的角度(與主角最多相差 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}

相關內容