![Tikz:標籤的位置逐步變化,而不是連續變化](https://rvso.com/image/400373/Tikz%EF%BC%9A%E6%A8%99%E7%B1%A4%E7%9A%84%E4%BD%8D%E7%BD%AE%E9%80%90%E6%AD%A5%E8%AE%8A%E5%8C%96%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E9%80%A3%E7%BA%8C%E8%AE%8A%E5%8C%96.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 手冊,正好位於版本 3.1.4b 的第 247 頁。相關報價:
- <angle> 用來決定主節點邊界上的位置。 (...)
- 然後,計算標籤節點的錨點。它是以這樣一種方式確定的,即
label node
意志「背向」邊界main node
。 (...) 對於這些「主」角度之間的角度(如 30° 或 110°), 使用組合錨,如south west
30° 或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}