是否可以將 TikZ 距離和 Line-To 操作結合?

是否可以將 TikZ 距離和 Line-To 操作結合?

使用 LaTeX 和 TikZ,是否可以在同一命令中使用 Line-To 操作作為距離操作?我想繪製一個矩形,然後在矩形上邊緣的中點建立一個命名節點。為此,我使用距離操作來尋找矩形的中心,然後使用線到操作來尋找上緣。請參閱下面的 MWE 程式碼,我認為程式碼應該可以工作,但實際上不起作用。

\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}
\node (A) at (0,0) {};
\node (B) at (10,10) {};
\node [above right] at (A) {A};
\node [below left] at (B) {B};
\draw [draw=black] (B) rectangle (A);
\node at ($(A)!0.5!(B)$ |- B) {Top of Rect [incorrect]};
\node (ABMid) [below] at ($(A)!0.5!(B)$) {Midpoint AB};
\node (rectTop) [above] at (ABMid|-B) {Top of Rect [correct]};
\end{tikzpicture}
\end{document}

答案1

我不會使用這樣的數學計算來獲得頂線中間的座標。路徑上的節點可以非常聰明地放置。

這裡的問題是,原始rectangle路徑上的節點放置僅在兩個座標之間的直線上,因此以下兩條路徑上的節點位於相同的位置<pos>

\path (c1) --        node[pos=<pos>] {} (c2);
\path (c1) rectangle node[pos=<pos>] {} (c2);

我將為您提供三種解決方案。

  1. 一個簡單的輔助座標。
  2. 將路徑替換rectangle為兩個|-/-|路徑。
  3. 使用適當的定時器rectangle通過來自ext.paths.timermy 的路徑的函數tikz-ext包裹

解決方案1

使用輔助座標,您可以簡單地執行以下操作

\draw (B) rectangle coordinate (aux1) (A) node[above] at (aux1 |- B) {Top of the Rect};

程式碼

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at (0,0);
\coordinate [label=below left:B] (B) at (20,10);
\draw (B) rectangle coordinate (aux1) (A) node[above] at (aux1 |- B) {Top of the Rect};
\end{tikzpicture}
\end{document}

解決方案2

使用兩個組合的|-“或”-|和位置“.75或” .25(分別)。角點的位置為.5(→聯合 TikZ 路徑上的節點)。

程式碼

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at (0,0);
\coordinate [label=below left:B] (B) at (20,10);
\draw (B) -| node[pos=.25, above] {Top of the Rect} (A) -| (B);
\end{tikzpicture}
\end{document}

解決方案3

載入ext.paths.timer庫,然後您可以使用very near start( pos = 0.125) 存取第一(頂)側的中間。

程式碼

\documentclass[tikz]{standalone}
\usetikzlibrary{ext.paths.timer}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at ( 0, 0);
\coordinate [label=below  left:B] (B) at (20,10);
\draw (B) rectangle node[very near start, above] {Top of the Rect} (A);
\end{tikzpicture}
\end{document}

輸出

在此輸入影像描述

答案2

編輯:底部可以看到內聯計算。

原則上是這樣。下面我還沒有真正優化過,可以稍微減少一些。

您可以使用let運算符(也來自calc圖書館)。

你想要做的是獲得最大y座標,然後選擇一半X協調。所以你需要Xy每個點的座標。

此外,你應該絕不node使用!指定座標這可能會帶來非常不可預見的問題。請記住,節點保留大小,而座標則不保留。

我會給你的系統做這樣的事情:

\begin{tikzpicture}
  \coordinate (A) at (0,0);
  \node[above right] at (A) {A};
  \coordinate (B) at (10,10);
  \node[below left] at (B) {B};
  \draw [draw=black] (A) rectangle (B);
  \draw let \p1 = (A),
          \p2 = (B),
          \n{x} = {(\x1+\x2)/2},
          \n{y} = {max(\y1,\y2)} in
          (\n{x},\n{y}) node[above] {Top of Rect [incorrect]};
  \coordinate (ABMid) at ($(A)!0.5!(B)$);
  \node at (ABMid) {Midpoint AB};
\end{tikzpicture}

當然,如果你不需要座標ABMid那就直接做\node at ($(A)!.5!(B)$) {...};

上面所做的就是計算在路上Xy頂點的座標。\p<int> = (<coordinate>)會保存Xy用於\x<int>,\y<int>在線內進一步計算let。該\n{x}行計算出X- 頂點的座標,\n{y}線計算最大值y-協調。

上面將產生:

在此輸入影像描述

我意識到你真的想要一些內聯的東西(這是可行的,但是醜陋的)。因此,您可以做的就是投影B到從 開始的垂直線上A,然後計算該點和 之間的中點B,這將為您提供所需直線的一半位置。

所以這可以透過這個來完成朦朧構造:

\coordinate (ABMidTop) at ($(A)!(B)!($(A)+(0,1)$)!.5!(B)$); 
\node[above] at (ABMidTop) {Top of Rect [incorrect]};

它應該這樣讀:
畫一條線AA+(0,1),然後投影B到這條線上。然後取前一個計算點和 之間的中間點B

相關內容